ES6 Symbol是否等同于带@@前缀的字符串?实例对比问询
关于ES6 Symbol的两个关键问题解答
嘿,这个问题问到点子上了!咱们一步一步来理清楚:
1. Symbol是不是仅仅是添加了@@前缀的字符串?
绝对不是!Symbol是ES6全新引入的原始数据类型,和字符串(String)是完全独立的两种类型,根本不是“带前缀的字符串”。
你提到的@@前缀,其实是控制台对“知名Symbol(Well-known Symbols)”的显示方式而已——比如Symbol.iterator、Symbol.toStringTag这些预定义的Symbol值,在控制台打印时会显示成@@iterator、@@toStringTag,但这只是一种可视化的标记,它们本质上还是Symbol类型,和字符串没有半毛钱关系。
举个简单的例子:
typeof Symbol.iterator; // 输出 'symbol' typeof '@@iterator'; // 输出 'string'
一眼就能看出两者类型完全不同。
2. Symbol('r2g.smoke.test')和String('@@r2g.smoke.test')等价吗?
完全不等价,不管是类型还是行为都差远了:
- 类型差异:前者是Symbol类型,后者是String类型。用
typeof一测就明白:typeof Symbol('r2g.smoke.test'); // 'symbol' typeof String('@@r2g.smoke.test'); // 'string' - 唯一性差异:Symbol的描述参数(这里的'r2g.smoke.test')只是用来调试的备注信息,哪怕两个Symbol的描述完全一样,它们也是互不相等的;但字符串只要内容相同就是相等的:
Symbol('r2g.smoke.test') === Symbol('r2g.smoke.test'); // false String('@@r2g.smoke.test') === String('@@r2g.smoke.test'); // true - 用途差异:Symbol主要用来创建对象的唯一属性键,避免属性名冲突;而字符串就是普通的文本数据,用途完全不同。
内容的提问来源于stack exchange,提问作者user7898461
相关产品推荐
相关产品推荐

