1. 程式人生 > >deep-in-es6(七)

deep-in-es6(七)

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(七)