欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ES6新特性之Symbol类型用法分析

程序员文章站 2022-05-15 11:23:21
本文实例讲述了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程序设计有所帮助。