Symbol特徵

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
    原文作者:小谷xg
    原文地址: https://segmentfault.com/a/1190000015323280
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞