Number, String, Boolean, undefined, null을 제외한 모든 값은 객체다
배열, 함수 등도 객체이며 이들은 참조 타입이라 불린다
var objA = { // objA는 객체 자체가 아닌 객체의 참조값을 저장할 뿐이다.
val : 30
};
var objB = objA; // 이제 objA와 objB는 같은 객체를 참조한다.
console.log(objA.val);
console.log(objB.val);
objB.val = 50; // 따라서 objB가 참조하는 객체의 프로퍼티를 변경하면 같은 객체를 참조하는 objA의 값 또한 바뀐다.
console.log(objB.val);
console.log(objA.val);
동등 연산자(==)를 사용해 두 객체를 비교할 때는 객체의 프로퍼티값이 아닌 참조값을 비교한다
var a = 100;
var b = 100;
var objA = {val: 100};
var objB = {val: 100};
var objC = objB;
console.log(a == b); // true
console.log(objA == objB); // false
console.log(objA.val == objB.val); // true
console.log(objB == objC); // true
call-by-value vs call-by-reference
기본 타입은 call-by-value로, 참조 타입은 call-by-reference로 동작한다
var a = 100;
var objA = {
value: 100
};
function changeArg(num, obj) {
num = 200;
obj.value = 200;
console.log(num); // 200
console.log(obj.value); // 200
}
console.log(a); // 100
console.log(objA.value); // 100
changeArg(a, objA);
console.log(a); // 100
console.log(objA.value); // 200
출처: 송형주, 고현준 저, 『인사이드 자바스크립트』, 한빛미디어(2014)