Symbol解析
Symbol解析
- 什么是Symbol
- 作用
什么是Symbol
ES5中提供了6種數(shù)據(jù)類型分別是:undefined、null、boolean、string、number、object。ES6中新增了一種數(shù)據(jù)類型Symbol來表示唯一的值,每個(gè)創(chuàng)建的Symbol都是唯一的,這樣在實(shí)際運(yùn)用中可以創(chuàng)建一些唯一的屬性及定義私有變量。
如何創(chuàng)建Symbol值:
let a = Symbol(); let b = Symbol(); console.log(a);//Symbol() console.log(b);//Symbol() console.log(a==b)//false我們創(chuàng)建了兩個(gè)Symbol值,打印發(fā)現(xiàn)它們都打印出Symbol(),難道他們是相等的嗎?那么我們打印他們是否相等發(fā)現(xiàn)他們并不是相等的。實(shí)際上它在內(nèi)存中是這樣的:
也就是說a變量和b變量拿到了各自的內(nèi)存引用。
如果不借助a變量,你不可能再得到這個(gè)地址。因此:
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)]: '李四' }為了區(qū)分,可以寫成:
import obj from './t2.js'; const NAME = Symbol('name1'); obj[NAME] = '李四'; console.log(obj); //{ age: 20, [Symbol(name)]: '張三', [Symbol(name1)]: '李四' }2、利用Symbol作為屬性名,屬性名不會(huì)被Object.keys()、Object.getOwnPropertyNames()、for…in循環(huán)返回。
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) { //構(gòu)造函數(shù)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提供了一種可以創(chuàng)建相同Symbol的機(jī)制,就是使用Symbol.for()方法進(jìn)行注冊。通過該方法生成的Symbol會(huì)根據(jù)描述符進(jìn)行全局注冊,之后再次通過Symbol.for()傳入相同的描述符時(shí),就可以得到相同的Symbol值。
5、Symbol.keyFor()
如果你想得到一個(gè)全局注冊的Symbol的描述符,可以使用Symbol.keyFor()方法:
Symbol.keyFor()方法返回一個(gè)已登記的 Symbol 類型值的key。變量s2屬于未登記的 Symbol 值,所以返回undefined。
總結(jié)
- 上一篇: vue首次赋值不触发watch
- 下一篇: [转]海南楼市泡沫拯救中国经济~ 恍然大