ES6新特性之Symbol类型用法分析
程序员文章站
2024-01-29 22:09:46
本文实例讲述了es6新特性之symbol类型用法。分享给大家供大家参考,具体如下:
symbol类型
1. 为了避免属性名的冲突,es6新增了symbol类型。symb...
本文实例讲述了es6新特性之symbol类型用法。分享给大家供大家参考,具体如下:
symbol类型
1. 为了避免属性名的冲突,es6新增了symbol类型。symbol可以产生一个独一无二的值。
let s1 = symbol('a'); let s2 = symbol('a'); console.log(s1); //symbol(a) console.log(typeof s1); //symbol console.log(s1 == s2); //false
2.symbol用于属性名。
var s1 = symbol(); var s2 = symbol(); var s3 = symbol(); var obj = { [s1]: 'hi' }; obj[s2] = 'es6'; object.defineproperty(obj, s3, { value: 'es2015' }); console.log(obj); //object {symbol(): "hi", symbol(): "es6", symbol(): "es2015"} console.log(obj.s1); //undefined -> 所以当用symbol作为属性名时候,不能用.运算符访问属性 console.log(obj[s1]); //hi console.log(obj['s1']); //undefined
注意:symbol作为属性名,该属性不会出现在 for...in...和 for...of... 循环中,也不会被 object.keys(), object.getownpropertynames() 返回。object.getownproertysymbols()返回一个数组,成员是当前对象的所有用作属性名的symbol值。
2. symbol.for() 接受一个字符串作为参数,然后搜索有没有以该参数作为名称的symbol值,有就返回这个symbol值,否则就新建并返回一个以该字符串为名称的symbol值。
3. symbol.keyfor()方法返回一个已经登记的symbol类型值的key。
symbol()方法生成一个symbol类型时,没有登记,所以每次调用symbol(哪怕传入相同的字符串)会返回不同的symbol,但是symbol.for()在生成symbol时候进行了登记,每次再次调用时,都会先寻找是否有传入相同参数的symbol,故只有symbol.for()产生的symbol才能被symbol.keyfor()找到。
let s1 = symbol('a'); let s2 = symbol('a'); let s3 = symbol.for('b'); let s4 = symbol.for('b'); let name1 = symbol.keyfor(s1); let name3 = symbol.keyfor(s3); console.log(s1 == s2); //false console.log(s1 == s3); //false console.log(s2 == s3); //false console.log(s3 == s4); //true console.log(name1); //undefined console.log(name3); //b
希望本文所述对大家ecmascript程序设计有所帮助。