Symbol()
함수를 통해 생성할 수 있다.const symbol = Symbol("Baik");
const cloneSymbol = Symbol("Baik");
// 두 심벌의 값은 동일하나, 각 심벌은 항상 고유 (unique) 하므로 다름.
console.log(symbol === cloneSymbol); // false
const obj = {};
const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");
obj[sym1] = "propertyValue1";
obj[sym2] = "propertyValue2";
obj[sym3] = "propertyValue3"; // sym2와의 충돌이 일어나지 않음!
console.log(obj); // {Symbol(): 'propertyValue1', Symbol(foo): 'propertyValue2', Symbol(foo): 'propertyValue3'}
console.log(obj[sym1]); // propertyValue1
console.log(obj[sym2]); // propertyValue2
console.log(obj[sym3]); // propertyValue3
for - in
반복문에 걸리지 않는다.Object.getOwnPropertySymbols()
함수를 통해 객체 속성의 배열을 얻는다.const obj = {
[Symbol("first")]: "first",
[Symbol("second")]: "second",
[Symbol("third")]: "third",
fourth: "fourth",
fifth: "fifth",
};
// for - in 구문을 사용할 경우, 키가 심볼인 프로퍼티는 열거되지 않는다.
for (const property in obj) {
console.log(property); // fourth, fifth
}
// 객체를 JSON으로 변환시킬 경우, 키가 심볼인 프로퍼티들은 무시된다.
JSON.stringfy(obj); // {"fourth": "fourth", "fifth": "fifth"}
// Object.getOwnPropertySymbols() 메소드로 심볼로 이루어진 배열을 받는다.
const symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols); // [Symbol(first), Symbol(second), Symbol(third)]
for (const symbol of symbols) {
console.log(obj[symbol]); // first, second, third
}
[Symbol.iterator]
프로퍼티다.Array.prototype[Symbol.iterator];
String.prototype[Symbol.iterator];
Map.prototype[Symbol.iterator];
Set.prototype[Symbol.iterator];
arguments[Symbol.iterator];
NodeList.prototype[Symbol.iterator];
HTMLCollection.prototype[Symbol.iterator];
const origin = Symbol.for("origin");
const newest = Symbol.for("origin");
console.log(origin === newest); // true
undefined
를 반환한다.Symbol 함수로 만든 심볼과 Symbol.for() 함수로 만든 심볼은 무슨 차이가?