JavaScript的基本數據類型有:(1)Undefined、(2)Null、(3)Boolean、(4)String、(5)Number、(6)Symbol、(7)Object。ES6 增加了Symbol類型,下面主要是講Symbol類型的一些相關知識點。
Symbol的特性
1、實例是唯一且不可改變的;一種唯一標識符,可用作對象的唯一屬性名,這樣其他人就不會改寫或覆蓋你設置的屬性值。
1 let id = Symbol("id");
2、數據類型的特點:唯一性,即使是用同一個變量生成的值也不相等。
1 let id1 = Symbol("id"); 2 let id2 = Symbol("id"); 3 console.log(id1 == id2); //false
3、數據類型的特點:隱藏性,for···in,object.keys() 不能訪問。
1 let id = Symbol("id"); 2 let obj = { 3 [id] : 'symbol'
4 } 5 for ( let key in obj){ 6 console.log(obj[key]); //輸出為空
7 }
能夠訪問的方法:Object.getOwnPropertySymbols,會返回一個數組,成員是當前對象的所有用作屬性名的 Symbol 值。
1 let id = Symbol("id"); 2 let obj = { 3 [id] : 'symbol'
4 } 5 let arr = Object.getOwnPropertySymbols(obj); 6 console.log(arr) // [Symbol(id)]
7 console.log(obj[arr[0]]) // 'symbol'
4、可多次使用同一個symbol值,官方提供了全局注冊並登記的方法:Symbol.for()
let name1 = Symbol.for("name"); // 檢測未創建后新建
let name2 = Symbol.for("name"); // 檢測已創建后返回
console.log(name1 == name2); // true
通過這種方法就可以通過參數值獲取到全局的symbol對象了,反之,可以通過Symbol.keyFor()獲取到參數值。
let name1 = Symbol.for("name"); let name2 = Symbol.for("name"); console.log(Symbol.keyFor("name1")); // 'name'
console.log(Symbol.keyFor("name2")); // 'name'
5、instanceof 的結果為 false
let s = Symbol('foo'); console.log(s instanceof Symbol); // false
注意:在創建symbol類型數據 時的參數只是作為標識使用,所以 Symbol() 作為參數也是可以的。
參考資料:(1)http://es6.ruanyifeng.com/#docs/symbol
(2)https://blog.csdn.net/qq_33408245/article/details/82953143