鍍金池/ 問答/HTML/ Symbol不會出現(xiàn)同名屬性怎么理解?

Symbol不會出現(xiàn)同名屬性怎么理解?

這句話:由于每一個 Symbol 值都是不相等的,這意味著 Symbol 值可以作為標(biāo)識符,用于對象的屬性名,就能保證不會出現(xiàn)同名的屬性。
使用了Symbol:

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

不使用Symbol:

  let b = {
    str: 'hello'
  }

b.str屬性同名就會覆蓋,a[sym]屬性同名也還是會覆蓋,當(dāng)他們出現(xiàn)同名屬性的時候都會覆蓋。所以說:Symbol保證不會出現(xiàn)同名屬性體現(xiàn)在哪了??

回答
編輯回答
情殺

由于你的第一個示例并不完整,因此我僅從語境中分析你的問題。

這句話:由于每一個 Symbol 值都是不相等的,這意味著 Symbol 值可以作為標(biāo)識符,用于對象的屬性名,就能保證不會出現(xiàn)同名的屬性。

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

每個從Symbol()返回的symbol值都是唯一的。一個symbol值能作為對象屬性的標(biāo)識符;這是該數(shù)據(jù)類型僅有的目的。更進一步的解析見—— glossary entry for Symbol。參見

兩句話字?jǐn)?shù)差不多,但是描述的完全不一樣。MDN中說的意思是返回值是唯一的,是返回值。也就是如果你保持它的唯一性,需要調(diào)用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

最后一行,并不是返回的值,而是已有的引用,內(nèi)存中獨此一份。

console.log(sym == sym)  //true
console.log(Symbol()==Symbol())//false
2018年6月13日 01:36
編輯回答
哚蕾咪
let json = {}
for (let index = 0; index < 11; index++) {
  let ss = Symbol()
  json[ss] = 'ssss'+index
}
console.log(json[Object.getOwnPropertySymbols(json)[3]]) // ssss3
2017年7月18日 02:39
編輯回答
夏木
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)
2018年2月10日 11:15