es6以前全部的屬性名都是字符串類型,容易形成屬性名的衝突。因此在es6新增了一種數據類型Symbol,表示獨一無二的值。Symbol並非一個對象,因此不能經過new的方法進行建立,同時也不能添加屬性。javascript
let s=Symbol(); console.log(typeof s)//out:symbol
Symbol與字符串處理java
var s1=Symbol('foo');經過字符串進行構造 var s2=Symbol('bar'); console.log(s1)//out:symbol(foo) console.log(s2)//out:symbol(bar) console.log(s1.toString()) console.log(s2.toString())
Symbol函數的參數只表示對當前Symbol值的描述,即便兩個Symbol的參數相同也並不相等.es6
var s1=Symbol(); var s2=Symbol(); console.log(s1==s2);//out:flash var s1=Symbol("foo"); var s2=Symbol("foo"); console.log(s1==s2);//out:flash
Symbol經過Object.getOwnPropertySymbols來返回一個數組 Reflect.ownKeys方法能夠返回全部類型的鍵名,包括常規鍵名和Symbol鍵名。正則表達式
Symbol.for(name),接受一個字符串,搜索是否存在着爲name的Symbol的對象,若是有返回這個Symbol值,不然建立一個以該字符串爲名稱的Symbol字符。數組
var s1 = Symbol.for('foo'); var s2 = Symbol.for('foo'); s1 === s2 // true
利用Symbol建立單例模式緩存
//mod.js文件 function A(){ this.foo='hello'; } if(!global._foo){ global._foo=new A(); } module.exports=global._foo;
由於global._foo是可寫的對象,一旦其餘改寫了該對象就會使其餘的加載mod.js模塊失效函數
//main.js var mod=require('./mod.js'); console.log(mod.foo);
下面採用Symbol的方式FOO_KEY自己不可一定,經過Symbol.for可能保證獲取到的foo對應的Symbol對象是惟一的。但一樣存在着一個問題就是用戶一旦清空緩存的時候會從新加載導致該模塊失效 。ui
//mod2.js const FOO_KEY=Symbol.for('foo'); function A(){ this.foo='hello'; } if(!global[FOO_KEY]){ global[FOO_KEY]=new A(); } module.exports=global[FOO_KEY]; //main2.js var a=require('./mod2.js'); global[Symbol.for('foo')]=123; console.log(global[Symbol.for('foo')]);
屬性
Symbol.length
長度屬性值爲1。
Symbol.name
僅Chrome/v8。返回符號描述。
Symbol.prototype
描述符號構造函數的原型。
衆所周知的符號
除了你本身的符號,JavaScript還內建了一些在ECMAScript 5 以前沒有暴露給開發者的符號,它們表明了內部語言行爲。這些符號可使用如下屬性訪問:
迭代 symbols
Symbol.iterator
一個返回一個對象默認迭代器的方法。使用 for...of.
正則表達式 symbols
Symbol.match
一個用於對字符串進行匹配的方法,也用於肯定一個對象是否能夠做爲正則表達式使用。使用 String.prototype.match().
Symbol.replace
一個替換匹配字符串的子串的方法. 使用 String.prototype.replace().
Symbol.search
一個返回一個字符串中與正則表達式相匹配的索引的方法。使用String.prototype.search().
Symbol.split
一個在匹配正則表達式的索引處拆分一個字符串的方法.。使用 String.prototype.split().
其餘 symbols
Symbol.hasInstance
一個肯定一個構造器對象識別的對象是否爲它的實例的方法。使用 instanceof.
Symbol.isConcatSpreadable
一個布爾值,代表一個對象是否應該flattened爲它的數組元素。使用Array.prototype.concat().
Symbol.unscopables
擁有和繼承屬性名的一個對象的值被排除在與環境綁定的相關對象外。
Symbol.species
一個用於建立派生對象的構造器函數。.
Symbol.toPrimitive
一個將對象轉化爲基本數據類型的方法。
Symbol.toStringTag
用於對象的默認描述的字符串值。使用Object.prototype.toString(). 方法
Symbol.for(key)
使用給定的key搜索現有符號,若是找到則返回符號。不然將獲得一個新的使用給定的key在全局符號註冊表中建立的符號。
Symbol.keyFor(sym)
爲給定符號從全局符號註冊表中檢索一個共享符號鍵。this