ES6 引入了一種新的原始數據範例 Symbol,示意舉世無雙的值。
1. Symbol 值經由過程 Symbol 函數天生,運用 typeof,效果為 “symbol”
var s = Symbol();
console.log(typeof s); // "symbol"
2. Symbol 函數前不能運用 new 敕令,不然會報錯。這是由於天生的 Symbol 是一個原始範例的值,不是對象。
3. instanceof 的效果為 false
var s = Symbol('foo');
console.log(s instanceof Symbol); // false
4. Symbol 函數能夠接收一個字符串作為參數,示意對 Symbol 實例的形貌,重要是為了在控制台顯現,或許轉為字符串時,比較輕易辨別。
var s1 = Symbol('foo');
console.log(s1); // Symbol(foo)
5. 假如 Symbol 的參數是一個對象,就會挪用該對象的 toString 要領,將其轉為字符串,然後才天生一個 Symbol 值。
const obj = {
toString() {
return 'abc';
}
};
const sym = Symbol(obj);
console.log(sym); // Symbol(abc)
6. Symbol 函數的參數只是示意對當前 Symbol 值的形貌,雷同參數的 Symbol 函數的返回值是不相等的。
// 沒有參數的狀況
var s1 = Symbol();
var s2 = Symbol();
console.log(s1 === s2); // false
// 有參數的狀況
var s1 = Symbol('foo');
var s2 = Symbol('foo');
console.log(s1 === s2); // false
7. Symbol 值不能與其他範例的值舉行運算,會報錯。
var sym = Symbol('My symbol');
console.log("your symbol is " + sym); // TypeError: can't convert symbol to string
8. Symbol 值能夠顯式轉為字符串。
var sym = Symbol('My symbol');
console.log(String(sym)); // 'Symbol(My symbol)'
console.log(sym.toString()); // 'Symbol(My symbol)'
9. Symbol 值能夠作為標識符,用於對象的屬性名,能夠保證不會湧現同名的屬性。
var mySymbol = Symbol();
// 第一種寫法
var a = {};
a[mySymbol] = 'Hello!';
// 第二種寫法
var a = {
[mySymbol]: 'Hello!'
};
// 第三種寫法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上寫法都獲得一樣效果
console.log(a[mySymbol]); // "Hello!"
10. Symbol 作為屬性名,該屬性不會湧現在 for…in、for…of 循環中,也不會被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。然則,它也不是私有屬性,有一個 Object.getOwnPropertySymbols 要領,能夠獵取指定對象的一切 Symbol 屬性名。
var obj = {};
var a = Symbol('a');
var b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
var objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols);
// [Symbol(a), Symbol(b)]
11. 假如我們願望運用同一個 Symbol 值,能夠運用 Symbol.for。它接收一個字符串作為參數,然後搜刮有無以該參數作為稱號的 Symbol 值。假如有,就返回這個 Symbol 值,不然就新建並返回一個以該字符串為稱號的 Symbol 值。
var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');
console.log(s1 === s2); // true
12. Symbol.keyFor 要領返回一個已登記的 Symbol 範例值的 key。
var s1 = Symbol.for("foo");
console.log(Symbol.keyFor(s1)); // "foo"
var s2 = Symbol("foo");
console.log(Symbol.keyFor(s2) ); // undefined