ES6之Symbol详解

举报
zhulin1028 发表于 2022/06/08 23:20:48 2022/06/08
【摘要】 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。 ES5对象属性名都是字符串容易造成属性名的冲突。 var a = { name: 'lucy'}; a.name = 'lili'; 这样就会重写属性 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。 重新复习下新知识:基本数据类型有6种:Und...

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。

ES5对象属性名都是字符串容易造成属性名的冲突。


  
  1. var a = { name: 'lucy'};
  2. a.name = 'lili';
这样就会重写属性

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。

重新复习下新知识:基本数据类型有6种:UndefinedNull、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

这里新添加了一种:Symbol

注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。


  
  1. // 没有参数的情况
  2. var s1 = Symbol();
  3. var s2 = Symbol();
  4. s1 === s2 // false
  5. // 有参数的情况
  6. var s1 = Symbol("foo");
  7. var s2 = Symbol("foo");
  8. s1 === s2 // false

Symbol值不能与其他类型的值进行运算

作为属性名的Symbol


  
  1. var mySymbol = Symbol();
  2. // 第一种写法
  3. var a = {};
  4. a[mySymbol] = 'Hello!';
  5. // 第二种写法
  6. var a = {
  7.   [mySymbol]: 'Hello!'
  8. };
  9. // 第三种写法
  10. var a = {};
  11. Object.defineProperty(a, mySymbol, { value: 'Hello!' });
  12. // 以上写法都得到同样结果
  13. a[mySymbol] // "Hello!"

注意,Symbol值作为对象属性名时,不能用点运算符。


  
  1. var a = {};
  2. var name = Symbol();
  3. a.name = 'lili';
  4. a[name] = 'lucy';
  5. console.log(a.name,a[name]);//lili,lucy

Symbol值作为属性名时,该属性还是公开属性,不是私有属性。

这个有点类似于java中的protected属性(protectedprivate的区别:在类的外部都是不可以访问的,在类内的子类可以继承protected不可以继承private

但是这里的Symbol在类外部也是可以访问的,只是不会出现在for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()返回。但有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名

Symbol.for()Symbol.keyFor()

Symbol.for机制有点类似于单例模式,首先在全局中搜索有没有以该参数作为名称的Symbol值,如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。和直接的Symbol就点不同了。


  
  1. var s1 = Symbol.for('foo');
  2. var s2 = Symbol.for('foo');
  3. s1 === s2 // true

Symbol.keyFor方法返回一个已登记的Symbol类型值的key。实质就是检测该Symbol是否已创建


  
  1. var s1 = Symbol.for("foo");
  2. Symbol.keyFor(s1) // "foo"
  3. var s2 = Symbol("foo");
  4. Symbol.keyFor(s2) // undefined

文章来源: zhulin1028.blog.csdn.net,作者:zhulin1028,版权归原作者所有,如需转载,请联系作者。

原文链接:zhulin1028.blog.csdn.net/article/details/124273261

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。