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

这句话:由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
使用了Symbol:

  let sym = Symbol();
  let a = {
    [sym]: 'Hello'
  }

不使用Symbol:

  let b = {
    str: 'hello'
  }

b.str属性同名就会覆盖,a[sym]属性同名也还是会覆盖,当他们出现同名属性的时候都会覆盖。所以说:Symbol保证不会出现同名属性体现在哪了??

阅读 3.2k
3 个回答
Symbol("foo") === Symbol("foo"); // false

比如你添加了一个Symbol('toString')方法,然后给别人用。别人也添加了一个Symbol('toString')方法,大家都不冲突。

  let a = {};
  let key1 = Symbol('toString')
  a[key1] = 'Hello1'

  console.log(a)

  let key2 = Symbol('toString')
  a[key2] = 'Hello2'
  console.log(a)

由于你的第一个示例并不完整,因此我仅从语境中分析你的问题。

这句话:由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。

不知道你是从哪里看到的,我找了下另外一个描述(来自MDN)。

每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。更进一步的解析见—— glossary entry for Symbol。参见

两句话字数差不多,但是描述的完全不一样。MDN中说的意思是返回值是唯一的,是返回值。也就是如果你保持它的唯一性,需要调用Symbol().

再来演示下你的第一个例子:

let sym = Symbol();
let a = {
    [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
let json = {}
for (let index = 0; index < 11; index++) {
  let ss = Symbol()
  json[ss] = 'ssss'+index
}
console.log(json[Object.getOwnPropertySymbols(json)[3]]) // ssss3
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题