deep-in-es6(七)
阿新 • • 發佈:2017-12-14
num string 調用 typeof java ava ssi iter mbo
Symbols對象 JavaScript的第七種原始類型
以前的數據類型:
Undefined 未定義
Null 空值
Boolean 布爾類型
Number 數字類型
String 字符串類型
Object 對象類型
前五種數據類型是有限的。Object對象類型是無限的。symbol是程序創建並且可以用作屬性鍵的值,並且他能避免命名沖突的風險。
var mySymbol = Symbol();//它的值與其它的值完全不相等
字符串或者數字可以作為屬性的鍵,Symbol也可以,他不等同於任何字符串,因而這個一Symbol為鍵的屬性可以保證不與其他屬性產生任何沖突。
var mySymbol = Symbol();//它的創建並沒有new關鍵字
var obj = {};
obj[mySymbol] = "assassin";
console.log(obj[mySymbol]);//assassin 保證不會沖突
以symbol為鍵的屬性與數組元素類似,訪問時必須使用方括號訪問這些屬性。
typeof Symbol();//"symbol" symbol與其他對象不完全相像
symbol創建後就不可以變更,不能為其設置屬性,它們可以使用做屬性名稱,這些性質一字符串類似。每一個symbol都是獨一無二的不與其他的symbol等同,即使二者有相同的描述也不相等。
symbol註意:symbol不能自動轉換成字符串,不能與字符串拼接,會得到TypeError。通過String(mySymbol)或者mySymbol.toString()可以轉換成字符串。
獲取symbol的三種方法
1.調用Symbol();這種方法每次的調用都會返回一個新的唯一的symbol
2.調用Symbol.for(string);這種方法會訪問symbol註冊表,其中存儲了已經存在的一些列symbol。這種與Symbol()定義的獨立mySymbol不同,第二種方法中的mySymbol是註冊表中的,是共享的,如果你好多次調用Symbol.for("cat");都會返回相同的mySymbol,註冊表非常有用,在多個web頁面中或者同一個web頁面中的多個模塊經常需要共享一個mySymbol;
var obj2 = {};
var mySymbol1 = Symbol.for("aaa");
var mySymbol2 = Symbol.for("aaa");
console.log(obj2[ mySymbol1 ]+" "+obj2[ mySymbol2 ]);//undefined undefined
console.log(obj2[ mySymbol1 ] == obj2[ mySymbol2 ]);//true
3.使用標準定義的symbol,如:Symbol.iterator.
symbol在es6中的應用:
1.使用instanceof可擴展。表達式object instanceof constructor被指定為構造函數的一個方法:constructor[Symbol.hasInstance](object);這意味著它是可擴展的。
2.消除新特性和舊代碼之間的沖突。添加某些ES6數組方法會破壞現有的Web網站.其他Web標準有相同的問題:想瀏覽器中添加新方法會破會原有的網站。問題主要由動態作用域引起,ES6引入一個特殊symbol(Symbol.unscopables),Web標準用這個symbol來阻止某些方法加入到動態作用域中。
3.支持新的字符串匹配類型。es5中str.match(myObject)會嘗試將其轉換成正則表達式對象(RegExp)。es6中他會檢查myObject是否有一個myObject[Symbol.match](str)方法。現在的庫可以提供自定義的字符串解析類。所有支持RegExp對象的環境都可以正常運行。
var mySymbol = Symbol();
var obj = {};
obj[mySymbol] = "assassin";
console.log(obj[mySymbol]);
var obj2 = {};
var mySymbol1 = Symbol.for("aaa");
var mySymbol2 = Symbol.for("aaa");
console.log(obj2[ mySymbol1 ]+" "+obj2[ mySymbol2 ]);//undefined undefined
console.log(obj2[ mySymbol1 ] == obj2[ mySymbol2 ]);//true
deep-in-es6(七)