let, const는 ES2015(ES6)에 추가된 변수 선언 키워드.
hoisting 규칙이 없고, block scoping을 지원합니다.
var 보다 훨씬 예측 가능하게 해줍니다.
let으로 선언된 변수는 레퍼런스가 바뀔 수 있고, const는 바뀔 수 없다.
let x = 1
x = 2 // x = 2로 ok!
const x = 1
x = 2 // x = 1로 uncaught TypeError; Assignment to constant variable
let taste = 'hot'
let food = 'chicken'
const dish = '${taste} ${food}' // 'hot chicken'
var x = 1
var x = 2 // ok!
let x = 1
let x = 2 // uncaught SyntaxError: Identifier 'x' has already been declared
2) var와는 달리 let과 const는 변수를 정의하기 전에는 사용할 수 없음.
var는 호이스팅 규칙을 따름. 변수 선언 전에도 먼저 사용 가능.
console.log(x) // undefined
var x = 0
console.log(x) // referenceError; Cannot access 'x' before initialization
const x = 0
3) let과 const 모두 같은 scoping rule을 따릅니다. (block scoping)
-> block 안에서 같은 것으로 만 취급한다.
var x = 1
{
var x = 2
console.log(x) // 2
}
console.log(x) // 2
const x = 1
{
const x = 2
console.log(x) // 2
}
console.log(x) // 1
결론 - let, const vs var
예측 가능성
과 유지보수성
이 var보다 훨씬 뛰어납니다.const personalData = {
nickname: 'JH',
email: 'jh12@gmail.com',
}
const publicData = {
age: 22,
}
const user = {
...personalData,
...publicData,
}
const overrides = {
DATABASE_HOST: 'myhost.com',
DATABASE_PASSWORD: 'mypassword',
}
const config = {
DATABASE_HOST: 'default.hostcom', // myhost.com이 됨
DATABASE_PASSWORD: '****' // mypassword가 됨
DATABASE_USERNAME: 'myuser',
...overrides, // 결국 나중에 온 내용을 override 함.
}
const user = {
nickname: 'JH',
age: 22,
email: 'jh12@example.com',
}
const { nickname, ...personalData } = user // 닉네임만 사용
console.log(personalData) // ( age:22, email: 'jh12@example.com' )
const pets = ['dog', 'cat']
const predators = ['wolf', 'cougar']
const animals = [...pets, ...predators]
console.log(animals) // ['dog', 'cat', 'wolf', 'cougar']
const [head, ...reast] = [1, 2, 3]
console.log(head) // 1
console.log(rest) // (2, 3)
const shouldOverride = true/false
const user = {
...{
email: 'abd@def.com',
password: '****',
},
...{
nickname: 'foo',
},
...(shouldOverride
? {
email: 'fff@fff.com',
}
: null),
}
console.log(user) * true = fff / false = abc