let 키워드
- let 키워드로 선언된 변수는 블록 레벨 스코프를 따릅니다.
- 함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉, 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선언한 변수는 모두 전역 변수이다.
- 모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다. 즉, 코드 블록 내부에서 선언한 변수는 지역 변수이다.
let a = 12
function myFunction() {
console.log(a)
let b = 13
if (true) {
let c = 14
console.log(b)
}
console.log(c)
}
myFunction()
const 키워드
- 변수를 상수화(constant)합니다.
- 변수에 할당된 값이 변경되지 않는다는 것을 의미합니다.
- const로 선언된 변수는 선언과 동시에 초기화해야 합니다.
const pi = 3.141
var r = 2
console.log(pi * r * r)
pi = 12
변수 호이스팅(Hoisting)
- 호이스팅(Hoisting)이란 함수 내의 변수 및 함수 선언을 각 유효 범위의 최상단으로 끌어 올려주는 JS의 독특한 특징이다.
- 실제로 코드가 끌어올려지는 것은 아니고, 자바스크립트 parser가 내부적으로 끌어올려서 처리한다.
- 컴파일 단계에서 코드 실행 전 함수와 변수 선언을 스캔하고, 모든 함수와 변수 선언들은 렉시컬 환경이라 불리는 자바스크립트 데이터 구조 내의 메모리에 추가된다
console.log(a)
var a = 'A'
var a
console.log(a)
a = 'A'
- var a를 상단으로 호이스팅했기 때문에 변수 선언 전에 console.log로 출력을 해도 에러가 발생하지 않고, undefined 가 출력된다.
- 모든 선언(function, var, let, const, class)은 JavaScript에서 호이스팅되며, var 선언은 undefined로 초기화되지만 let 및 const 선언은 초기화되지 않은 Temporal Dead Zone 상태로 유지된다.
상수를 통한 객체 참조
- 객체를 상수로 선언하더라도 객체 내부의 값은 변경 가능합니다.
- 객체를 상수로 선언하면 객체 자체를 다른 값으로 참조할 수 없게 됩니다.
- 객체 내부의 값은 변경이 가능하기 때문에, 객체 내부의 값을 변경하지 않도록 주의해야 합니다.
const a = {
name: '민호',
}
console.log(a.name)
a.name = '수지'
console.log(a.name)
a = {}
파라미터 기본값
- 자바스크립트는 함수가 파라미터 값을 받지 못할때 기본값을 지정할수 있는 방법이 없었습니다.
- 파라미터가 undefined이면 기본값을 할당하는 식으로 코딩을 함
function myFunction(x = 1, y = 2, z = 3 + 5) {
console.log(x, y, z)
}
myFunction(6, 7)
펼침 연산자
- 이전에는 배열값을 함수 인자로 넘기려면 apply()내장 메소드를 이용해서 사용 했다.
function myFunction(a, b) {
return a + b
}
var data = [1, 4]
var result = myFunction.apply(null, data)
console.log(result)
- apply()는 배열 값을 하나하나 꺼낸 다음에 개별적인 함수 인자를 만들어 호출 한다.
- ES6 펼침연사자를 사용하면 더욱 쉽다.
- 자바스크립트 해석기는 ...data를 먼저 1,4로 치환한 다음 myFunction함수를 호출한다. let result = myFunction(...data); -> let result = myFunction(1,4);
function myFunction(a, b) {
return a + b
}
let data = [1, 4]
let result = myFunction(...data)
console.log(result)
배열 값을 다른 배열의 일부로 만듦
- 펼침 연산자로 배열 값을 다른 배열에 부분 편일 할수 있습니다.
let array1 = [2, 3, 4]
let array2 = [1, ...array1, 5, 6, 7]
console.log(array2)
- 다음과 같이 코드가 변경된다. let array2 = [1, ...array1, 5, 6, 7]; -> array2 = [1, 2, 3, 4, 5, 6, 7];
배열값을 다른 배열에 밀어 넣기
var array1 = [2, 3, 4]
var array2 = [1]
Array.prototype.push.apply(array2, array1)
console.log(array2)
let array1 = [2, 3, 4]
let array2 = [1]
array2.push(...array1)
console.log(array2)
여러 배열 펼침
let array1 = [1]
let array2 = [2]
let array3 = [...array1, ...array2, ...[3, 4]]
let array4 = [5]
function myFunction(a, b, c, d, e) {
return a + b + c + d + e
}
let result = myFunction(...array3, ...array4)
console.log(result)
배열 해제할당
- 배열 해체 할당은 객체에서 값을 추출하여 변수에 할당한다.
- ES5 이전에는 아래와 같이 배열에 값을 추출해서 변수에 할당했다.
var myArray = [1, 2, 3]
var a = myArray[0]
var b = myArray[1]
var c = myArray[2]
console.log(a, b, c)
let myArray = [1, 2, 3]
let a, b, c
;[a, b, c] = myArray
console.log(a, b, c)
let [a, b, c] = [1, 2, 3]
console.log(a, b, c)
값을 건너뛴다
let [a, , b] = [1, 2, 3]
console.log(a)
console.log(b)
배열 해체 할당에 나머지 연산자를 이용
let [a, ...b] = [1, 2, 3, 4, 5, 6]
console.log(a)
console.log(Array.isArray(b))
console.log(b)
변수의 기본값
- 해체 할당이 안된 변수의 기본값을 undefined이외의 값으로 지정할수 있다.
let [a, b, c = 3] = [1, 2]
console.log(c)
중첩 배열 해체
let [a, b, [c, d]] = [1, 2, [3, 4]]
console.log(a, b, c, d)
파라미터로 배열 해체 할당 사용
- 함수 파라미터 자리에 기본값을 지정해서 사용할수 있다.
function myFunction([a, b, c = 3] = [1, 2, 3]) {
console.log(a, b, c)
}
myFunction(undefined)
객체 해체 할당
- 객체 해제 할당은 객체 프로퍼티 값을 추출해서 변수에 할당한다.
- ES5 이전에는 객체 프로퍼티 값을 다른 변수에 할당하러면 이방법뿐이였다.
var object = { name: '민호', age: 23 }
var name = object.name
var age = object.age
let object = { name: '민호', age: 23 }
let name, age
;({ name, age } = object)
변수의 기본값
- 객체 프로퍼티가 undefined일 경우에는 변수에 기본값을 준다.
let { a, b, c = 3 } = { a: '1', b: '2' }
console.log(c)
조합 프로퍼티 명을 해체
- 프로퍼티명을 동적으로 조합할 경우 표현식을 [] 감싼다.
let { ['first' + 'Name']: x } = { firstName: '수지' }
console.log(x)
중첩 객체를 해체
- 중첩된 객체의 프로퍼티는 다음과 같이 추출한다.
var {
name,
otherInfo: { age },
} = { name: '수지', otherInfo: { age: 23 } }
console.log(name, age)
파라미터로 객체 해체 할당 사용
- 배열 해체 할당과 더블어 객체 해체 할당도 함수 파라미터로 사용 가능
function myFunction({ name = '수지', age = 23, profession = '연예인' } = {}) {
console.log(name, age, profession)
}
myFunction({ name: '민호', age: 23 })
화살표 함수
- ES6부터 => 연산자로 함수를 생성하는 화살표 함수가 생김
- 화살표 함수는 간결한 구문을 지닌 익명 함수이다.
let circleArea = (pi, r) => {
let area = pi * r * r
return area
}
let result = circleArea(3.14, 3)
console.log(result)
var circleArea = function (pi, r) {
let area = pi * r * r
return area
}
var result = circleArea(3.14, 3)
console.log(result)
let circleArea = (pi, r) => pi * r * r
let result = circleArea(3.14, 3)
console.log(result)
프로퍼티 정의
- ES6 부터 변수명과 동일한 이름을 가진 객체 프로퍼티에 간편하게 값을 할수 있음
var x = 1,
y = 2
var object = {
x: x,
y: y,
}
let x = 1,
y = 2
let object = { x, y }
console.log(object.x)
메소드 정의
let object = {
myFunction() {
console.log('안녕하세요!!!')
},
}