string
,number
,bigint
,boolean
,undefined
,symbol
,null
배열
[]
,객체
{}
,함수
function(){}
[] === [] // false
이제 위의 예시같은 빈 배열과 빈 배열이 다르다는 사실을 쉽게 이해할 수 있다. ===
은 주소값까지 비교하기 때문에 주소값이 다른 두개의 배열이라는 사실을 알 수 있다.
let arr1 = [1, 2, 3]
let arr2 = arr1
arr1 === arr2
// true
위 예제는 arr1
를 arr2
에 복사하면서 주소값을 공유하고 있다.
arr1.push(4)
console.log(arr2)
// [1, 2, 3, 4]
arr1
에 push(4)
하면 같은 주소를 참조하고 있는 arr2
역시 변경된 배열을 확인할 수 있다.
arr2 = "not array, string"
console.log(arr1)
// [1, 2, 3, 4]
arr2
에 원시 자료형을 재할당하면 주소를 담았던 공간에 값이 담기며, arr1
은 영향을 받지 않고 배열을 그대로 출력한다.
값에 의한 호출 방식은 함수의 인자로 어떤 변수를 넘길 때 해당 변수가 가지고 있는 값을 그대로 복사하여 넘겨주는 방식.
let word = 'Hello!'
function replaceWord (str) {
str = 'Yello!'
return str
}
replaceWord(word)
console.log(word) // 'Hello!'
word
변수에 담긴 'Hello!'
문자열 값을 str
매개변수의 전달인자로 넘길 때, 값 자체가 복사되어 할당된다. 즉, 함수 내의 str
을 수정하더라도 word
변수에는 전혀 영향을 주지 않는다.
참조에 의한 호출 방식은 변수가 가리키고 있는 메모리 공간의 주소를 넘기는 방식.
let array = []
function addStringToArray (arr) {
arr.push('Hello')
return arr
}
addStringToArray(array)
console.log(array) // ['Hello']
빈 array
를 addStringToArray
의 매개변수 arr
의 전달인자로 넘길 때, array
의 주소값이 할당됩니다. 같은 주소를 갖고 있기 때문에 함수 내부에서 배열을 수정할 수 있습니다.
원시 자료형과 참조 자료형 | 코드스테이츠
변하지 않는 상태를 유지하는 방법, 불변성(Immutable)