ES6入门之Symbol
?
ES5對象屬性名都是字符串容易造成屬性名的沖突。
eg:var a = { name: 'lucy'};a.name = 'lili';這樣就會重寫屬性
ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值。
重新復習下新知識:基本數據類型有6種:Undefined、Null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。
這里新添加了一種:Symbol
注意,Symbol函數前不能使用new命令,否則會報錯。這是因為生成的Symbol是一個原始類型的值,不是對象
Symbol函數可以接受一個字符串作為參數,表示對Symbol實例的描述,主要是為了在控制臺顯示,或者轉為字符串時,比較容易區分。
// 沒有參數的情況 var s1 = Symbol(); var s2 = Symbol();s1 === s2 // false// 有參數的情況 var s1 = Symbol("foo"); var s2 = Symbol("foo");s1 === s2 // falseSymbol值不能與其他類型的值進行運算
作為屬性名的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,lucySymbol值作為屬性名時,該屬性還是公開屬性,不是私有屬性。
這個有點類似于java中的protected屬性(protected和private的區別:在類的外部都是不可以訪問的,在類內的子類可以繼承protected不可以繼承private)
但是這里的Symbol在類外部也是可以訪問的,只是不會出現在for...in、for...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 // trueSymbol.keyFor方法返回一個已登記的Symbol類型值的key。實質就是檢測該Symbol是否已創建
var s1 = Symbol.for("foo"); Symbol.keyFor(s1) // "foo"var s2 = Symbol("foo"); Symbol.keyFor(s2) // undefined?
轉載于:https://www.cnblogs.com/ecmasea/p/8985806.html
總結
以上是生活随笔為你收集整理的ES6入门之Symbol的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ4596:[SHOI2016]黑
- 下一篇: 多线程-单生产单消费模型