ES6入門之Symbol

ES5對象屬性名都是字符串容易形成屬性名的衝突。java

eg:var a = { name: 'lucy'};

a.name = 'lili';
這樣就會重寫屬性

ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值。函數

從新複習下新知識:基本數據類型有6種:Undefined、Null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。spa

這裏新添加了一種:Symbolcode

注意,Symbol函數前不能使用new命令,不然會報錯。這是由於生成的Symbol是一個原始類型的值,不是對象對象

Symbol函數能夠接受一個字符串做爲參數,表示對Symbol實例的描述,主要是爲了在控制檯顯示,或者轉爲字符串時,比較容易區分。blog

複製代碼
// 沒有參數的狀況
var s1 = Symbol();
var s2 = Symbol();

s1 === s2 // false

// 有參數的狀況
var s1 = Symbol("foo");
var s2 = Symbol("foo");

s1 === s2 // false
複製代碼

Symbol值不能與其餘類型的值進行運算繼承

做爲屬性名的Symbol

複製代碼
var mySymbol = Symbol();

// 第一種寫法
var a = {};
a[mySymbol] = 'Hello!';

// 第二種寫法
var a = {
  [mySymbol]: 'Hello!'
};

// 第三種寫法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上寫法都獲得一樣結果
a[mySymbol] // "Hello!"
複製代碼

注意,Symbol值做爲對象屬性名時,不能用點運算符。字符串

var a = {};
var name = Symbol();
a.name = 'lili';
a[name] = 'lucy';
console.log(a.name,a[name]);             //lili,lucy

Symbol值做爲屬性名時,該屬性仍是公開屬性,不是私有屬性。get

這個有點相似於java中的protected屬性(protected和private的區別:在類的外部都是不能夠訪問的,在類內的子類能夠繼承protected不能夠繼承private)it

可是這裏的Symbol在類外部也是能夠訪問的,只是不會出如今for...infor...of循環中,也不會被Object.keys()Object.getOwnPropertyNames()返回。但有一個Object.getOwnPropertySymbols方法,能夠獲取指定對象的全部Symbol屬性名

Symbol.for(),Symbol.keyFor()

Symbol.for機制有點相似於單例模式,首先在全局中搜索有沒有以該參數做爲名稱的Symbol值,若是有,就返回這個Symbol值,不然就新建並返回一個以該字符串爲名稱的Symbol值。和直接的Symbol就點不一樣了。

var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.keyFor方法返回一個已登記的Symbol類型值的key。實質就是檢測該Symbol是否已建立

var s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

var s2 = Symbol("foo");
Symbol.keyFor(s2) // undefined
相關文章
相關標籤/搜索