값 | scope | 변수 재선언 | 변수 값변경 |
---|---|---|---|
var | function-scope | O | O |
let | block-scope | O | X |
const | block-scope | X | X |
function foo(){
if(true) {
var fruit1 = 'apple'; //function scope
const fruit2 = 'banana'; //block scope
let fruit3 = 'strawberry'; //lock scope
}
console.log(fruit1);
console.log(fruit2);
console.log(fruit3);
}
foo();
//result:
//apple
//error: fruit2 is not defined
//error: fruit3 is not defined
var
- 호이스팅으로 인해 어디서든 변수 선언은 최상위에 선언한 것과 동등합니다. 이것은 변수가 선언되기 전에 사용 될 수 있다는 것을 의미합니다.
- 변수 재선언이 가능하기 때문에 의도하지 않은 변수값의 변경이 일어날 수 있습니다.
- 사용하지 않는 것을 것을 권장합니다.
cf. const
도 객체나 배열의 내부는 변경이 가능합니다.
Arrow Functions은 함수 표현식을 더욱 짧게 작성할 수 있습니다.
function
return
키워드와 중괄호(curly brackets)를 사용할 필요가 없습니다.
함수를 정의하는 방법에는 함수 선언식과 함수 표현식이 존재하는데
함수 표현식은 익명함수를 변수에 할당하는 방식입니다.
// 함수 선언식
function foo(x, y) {
return x * y;
}
// 함수 표현식
// ES5
var foo = function(x, y) {
return x * y;
}
// ES6
const foo = (x, y) => x * y;
this
가 없습니다.const
를 사용하는 것이 안전합니다.return
키워드와 중괄호를 생략할 수 있습니다.화살표 함수에서의 this
는 일반 함수에서의 this
와 차이가 있습니다.
화살표 함수는 자신의 this가 없는 대신 화살표 함수를 둘러싸는 렉시컬 범위(lexical scope)의 this가 사용됩니다.
화살표 함수는 일반 변수 조회 규칙(normal variable lookup rules)을 따르기 때문에 현재 범위에서 존재하지 않는 this를 찾을 때, 화살표 함수는 바로 바깥 범위에서 this를 찾는것으로 검색을 끝내게 됩니다.
cf) 일반 함수의 this
- 일반 함수에서
this
는 함수를 호출한 객체를 나타내기 때문에 어디서 어떻게 호출되느냐에 따라 window, document, button 등이 될 수 있습니다.- 일반 함수의 내부함수, 콜백함수에 사용되는 this는 window입니다.
// Regular Function: hello = function() { document.getElementById("demo").innerHTML += this; } // The window object calls the function: window.addEventListener("load", hello); // A button object calls the function: document.getElementById("btn").addEventListener("click", hello);
const obj = { name: 'js', foo: function () { console.log(this); console.log(this.name); } }; obj.foo(); // {name: "js", foo: ƒ} // js const val = obj.foo; val(); // Window {window: Window, self: Window, document: document, …} // undefined
// Bad
const person = {
name: 'Lee',
sayHi: () => console.log(`Hi ${this.name}`)
};
person.sayHi(); // Hi undefined
---------------------------------------------
// Good
const person = {
name: 'Lee',
sayHi() { // === sayHi: function() {
console.log(`Hi ${this.name}`);
}
};
person.sayHi(); // Hi Lee
// Bad
const person = {
name: 'Lee',
};
Object.prototype.sayHi = () => console.log(`Hi ${this.name}`);
person.sayHi(); // Hi undefined
---------------------------------------------
// Good
const person = {
name: 'Lee',
};
Object.prototype.sayHi = function() {
console.log(`Hi ${this.name}`);
};
person.sayHi(); // Hi Lee
// Bad
var button = document.getElementById('myButton');
button.addEventListener('click', () => {
console.log(this === window); // => true
this.innerHTML = 'Clicked button';
});
---------------------------------------------
// Good
var button = document.getElementById('myButton');
button.addEventListener('click', function() {
console.log(this === button); // => true
this.innerHTML = 'Clicked button';
});
ES6 이전에는 자바스크립트에 class
문법이 없었습니다. 따라서 이 개념을 구현하려면 prototype
문법을 사용하여 다음과 같이 구현해야 했습니다.
function Dog(name) {
this.name = name;
}
Dog.prototype.say = function() {
console.log(`${this.name}: 멍멍`);
};
const dog = new Dog('댕댕이');
dog.say();
그러나 ES6 에서 class
문법이 구현되었고, 위의 코드를 다음과 같이 작성 할 수 있습니다.
class Dog {
constructor(name) {
this.name = name;
}
say() {
console.log(`${this.name}: 멍멍`);
}
}
const dog = new Dog('댕댕이');
dog.say();
JavaScript class는 객체가 아니라, JavaScript 객체의 template 입니다. 따라서 객체를 생성하기 위해서는 다음과 같이 해야합니다.
let myCar1 = new Car("Ford", 2014); let myCar2 = new Car("Audi", 2019);
싱글쓰레드인 자바스크립트에서 비동기 처리를 위해서 콜백(callback)을 사용해 왔습니다.
덕분에 비동기 처리를 온전히 해낼 수 있었지만 이런 콜백이 사용되는 경우가 많아지면서 단점이 드러났습니다.
그 단점은 비동기 처리를 순차적으로 실행할 필요가 있는 경우에 비동기 처리를 중첩시켜서 표현하므로 에러, 예외처리가 어렵다는 것과 중첩으로 인한 복잡도가 증가하는 것입니다.
크게 이 두 가지의 단점을 해결하기위해 프로미스가 예전부터 라이브러리로 생겨났고, 이것을 ES6에서는 언어적 차원에서 지원하게 되었습니다.
const person = {
firstName: "John",
lastName: "Doe",
age: 50,
eyeColor: "blue"
};
let id = Symbol('id');
person.id = 140353;
Symbol은 언제나 unique 합니다. 따라서 동일한 input 값을 넣어도 결과는 다릅니다.
Symbol("id") == Symbol("id") // false
function myFunction(x, y = 10) {
// y is 10 if not passed or undefined
return x + y;
}
myFunction(5); // will return 15
function sum(...args) {
let sum = 0;
for (let arg of args) sum += arg;
return sum;
}
let x = sum(4, 9, 16, 25, 29, 100, 66, 77);
Array.find()
Array.findIndex()
find()
는 배열에서 파라미터로 전달된 함수의 조건의 결과가 true가 되는 첫번째 인자를 반환합니다.
findIndex()
는 배열에서 파라미터로 전달된 함수의 조건의 결과가 true가 되는 첫번째 index를 반환합니다.
var numbers = [4, 9, 16, 25, 29];
var first = numbers.find(myFunction);
var firstIdx = numbers.findIndex(myFunction);
function myFunction(value, index, array) {
return value > 18;
}
Number.isInteger()
Number.isSafeInteger()
-example-
Number.isInteger(10); // returns true
Number.isInteger(10.5); // returns false
Number.isSafeInteger(10); // returns true
Number.isSafeInteger(12345678901234567890); // returns false
Safe integers are all integers from -(253 - 1) to +(253 - 1).
This is safe: 9007199254740991. This is not safe: 9007199254740992.
isFinite()
isNaN()
-example-
isFinite(10/0); // returns false
isFinite(10/1); // returns true
isNaN("Hello"); // returns true
// ES5
var obj = {
name: 'Lee',
sayHi: function() {
//
}
};
// ES6
const obj = {
name: 'Lee',
// 메소드 축약 표현
sayHi() {
//
}
};
https://www.w3schools.com/js/js_es6.asp
https://poiemaweb.com/es6-arrow-function
https://velog.io/@parksj3205/2019-08-30-1208-%EC%9E%91%EC%84%B1%EB%90%A8
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/%EC%95%A0%EB%A1%9C%EC%9A%B0_%ED%8E%91%EC%85%98
https://bubobubo003.tistory.com/54