这句话:由于每一个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)

哈士奇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()])//undefineda[Symbol()]=123console.log(a)//{[Symbol()]:'Hello',[Symbol()]:123}console.log(a[sym])//Hello最后一行,并不是返回的值,而是已有的引用,内存中独此一份。console.log(sym==sym)//trueconsole.log(Symbol()==Symbol())//false
添加回答
举报
0/150
提交
取消