Symbol解析
Symbol解析
- 什么是Symbol
- 作用
什么是Symbol
ES5中提供了6種數據類型分別是:undefined、null、boolean、string、number、object。ES6中新增了一種數據類型Symbol來表示唯一的值,每個創建的Symbol都是唯一的,這樣在實際運用中可以創建一些唯一的屬性及定義私有變量。
如何創建Symbol值:
let a = Symbol(); let b = Symbol(); console.log(a);//Symbol() console.log(b);//Symbol() console.log(a==b)//false我們創建了兩個Symbol值,打印發現它們都打印出Symbol(),難道他們是相等的嗎?那么我們打印他們是否相等發現他們并不是相等的。實際上它在內存中是這樣的:
也就是說a變量和b變量拿到了各自的內存引用。
如果不借助a變量,你不可能再得到這個地址。因此:
let a = Symbol(); let b = Symbol(); console.log(a);//Symbol() console.log(b);//Symbol() console.log(a==b)//falselet c = b; console.log(c)//Symbol() console.log(c==b)//true作用
1、為了防止對象屬性名被覆蓋,可以通過symbol來定義屬性名。
const NAME = Symbol('name') let obj = {[NAME]:'張三',age: 20 } export default obj; import obj from './t2.js'; const NAME = Symbol('name'); obj[NAME] = '李四'; console.log(obj); //{ age: 20, [Symbol(name)]: '張三', [Symbol(name)]: '李四' }為了區分,可以寫成:
import obj from './t2.js'; const NAME = Symbol('name1'); obj[NAME] = '李四'; console.log(obj); //{ age: 20, [Symbol(name)]: '張三', [Symbol(name1)]: '李四' }2、利用Symbol作為屬性名,屬性名不會被Object.keys()、Object.getOwnPropertyNames()、for…in循環返回。
let obj = {[Symbol()]:'張三',age: 20,height:'178com' } for(let key in obj){console.log(key); } //age //height let keys = Object.keys(obj); console.log(keys); //輸出:[ 'age', 'height' ] console.log(Object.getOwnPropertyNames(obj)); //輸出:[ 'age', 'height' ]3、可以在類里利用Symbol來定義私有屬性及方法。
let People = (function(){let name = Symbol("name");class People {constructor(yourName) { //構造函數this[name] = yourName}sayName() {console.log(this[name])}}return People; })(); let zhangsan = new People("張三"); console.log(zhangsan[Symbol("name")]); //undefined zhangsan.sayName(); //張三4、Symbol.for()
Symbol提供了一種可以創建相同Symbol的機制,就是使用Symbol.for()方法進行注冊。通過該方法生成的Symbol會根據描述符進行全局注冊,之后再次通過Symbol.for()傳入相同的描述符時,就可以得到相同的Symbol值。
5、Symbol.keyFor()
如果你想得到一個全局注冊的Symbol的描述符,可以使用Symbol.keyFor()方法:
Symbol.keyFor()方法返回一個已登記的 Symbol 類型值的key。變量s2屬于未登記的 Symbol 值,所以返回undefined。
總結
- 上一篇: vue首次赋值不触发watch
- 下一篇: [转]海南楼市泡沫拯救中国经济~ 恍然大