let obj = {
name: "병건",
age: 28,
};
let obj = new Object();
obj.name = "병건";
obj.age = 28;
자바스크립트에는 7개의 원시타입(primitive)이 존재한다. 이러한 단순 원시 타입은 객체가 아니다. 따라서 "자바스크립트는 모든 것이 객체다." 라는 말은 사실이 아니다.
typeof null === object //=> true
인 것은 자바스크립트의 오랜 버그다. "단순" 원시타입은 객체가 아니다.내장 객체라는 객체 하위 타입이 있다.
new
키워드와 함께 각각 하위 객체를 생성하는 생성자들이다.var primitiveStr = "단순 원시 문자열";
var objectStr = new String("문자열 객체");
console.log(typeof primitiveStr); //=> string
console.log(typeof objectStr); //=> object
console.log(primitiveStr instanceof String); //=> false
console.log(objectStr instanceof String); //=> true
"단순 원시 문자열"
이라는 원시 값은 객체가 아니라 원시 리터럴이며 불변값이다.우리는 재할당을 const
로 방지하려고 한다. 그러나 객체에서 const는 얕은 불변성만을 제공한다.
const obj = {
name: "조병건",
age: 28,
};
// obj = {} !!Error
obj.name = "병건";
const
는 객체에게 얕은 불변성만을 제공해준다는 것이다.Object.defineProperties 써서 원하는 프로퍼티를 불변하게 만들 수 있다.
writable : false
configurable : false
var obj = {};
Object.defineProperties(obj, {
name: {
value: "조병건",
writable: false,
configurable: false,
},
age: {
value: 28,
writable: true,
},
});
obj.name = "asdasd"; //error가 나진 않음
console.log(obj.name); //변경되지 않음
obj.age = 9999;
console.log(obj.age); //변경됨
Object.preventExtensions
를 사용하면, 해당 object의 프로퍼티 확장이 불가능해진다.var obj = {
name: "조병건",
};
Object.preventExtensions(obj);
obj.age = 28;
console.log(obj.age); //=> undefined
말 그대로 객체를 "봉인"시킨다. seal()은 다음과 같은 작업을 한다.
Object.preventExtentions()
configurable = false
모든 프로퍼티에 configurable을 false
로 만든다.말 그대로 객체를 "동결"시킨다. 객체를 확장할 수도 없고, 프로퍼티의 값을 변경시킬 수도 없다. 반면, 객체를 재할당 하는 것은 가능하다. 재할당의 방지는 const가 해주는 것이기 때문이다.
var obj = {
name: "병건",
age: 28,
};
obj.a = 123;
obj.name = "asdasdasd";
console.log(obj); // 그대로다.
obj = {};
console.log(obj); // {}
freeze 내부에 객체가 존재할 수 있다. freeze를 하게되면 객체 내부에 참조하고 있는 객체들을 모두 "동결"시키기 때문에(Deep freeze), 작성한 코드가 동작 안할 수 있으므로 주의하자.