为了账号安全,请及时绑定邮箱和手机立即绑定

Symbol不会出现同名属性怎么理解?

Symbol不会出现同名属性怎么理解?

MMMHUHU 2019-05-21 09:11:04
这句话:由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。使用了Symbol:letsym=Symbol();leta={[sym]:'Hello'}不使用Symbol:letb={str:'hello'}b.str属性同名就会覆盖,a[sym]属性同名也还是会覆盖,当他们出现同名属性的时候都会覆盖。所以说:Symbol保证不会出现同名属性体现在哪了??
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

Symbol("foo")===Symbol("foo");//false
比如你添加了一个Symbol('toString')方法,然后给别人用。别人也添加了一个Symbol('toString')方法,大家都不冲突。
leta={};
letkey1=Symbol('toString')
a[key1]='Hello1'
console.log(a)
letkey2=Symbol('toString')
a[key2]='Hello2'
console.log(a)
                            
查看完整回答
反对 回复 2019-05-21
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

由于你的第一个示例并不完整,因此我仅从语境中分析你的问题。
这句话:由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
不知道你是从哪里看到的,我找了下另外一个描述(来自MDN)。
每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。更进一步的解析见——glossaryentryforSymbol。参见
两句话字数差不多,但是描述的完全不一样。MDN中说的意思是返回值是唯一的,是返回值。也就是如果你保持它的唯一性,需要调用Symbol().
再来演示下你的第一个例子:
letsym=Symbol();
leta={
[sym]:'Hello'
}
console.log(a)//{[Symbol()]:'Hello'}
console.log(a[Symbol()])//undefined
a[Symbol()]=123
console.log(a)//{[Symbol()]:'Hello',[Symbol()]:123}
console.log(a[sym])//Hello
最后一行,并不是返回的值,而是已有的引用,内存中独此一份。
console.log(sym==sym)//true
console.log(Symbol()==Symbol())//false
                            
查看完整回答
反对 回复 2019-05-21
  • 2 回答
  • 0 关注
  • 411 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号