亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Symbol不會出現同名屬性怎么理解?

Symbol不會出現同名屬性怎么理解?

慕的地6264312 2019-03-22 19:15:00
這句話:由于每一個 Symbol 值都是不相等的,這意味著 Symbol 值可以作為標識符,用于對象的屬性名,就能保證不會出現同名的屬性。使用了Symbol:  let sym = Symbol();  let a = {    [sym]: 'Hello'  }不使用Symbol:  let b = {    str: 'hello'  }b.str屬性同名就會覆蓋,a[sym]屬性同名也還是會覆蓋,當他們出現同名屬性的時候都會覆蓋。所以說:Symbol保證不會出現同名屬性體現在哪了??
查看完整描述

3 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超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)


查看完整回答
反對 回復 2019-04-03
?
森林海

TA貢獻2011條經驗 獲得超2個贊

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

這句話:由于每一個 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


查看完整回答
反對 回復 2019-04-03
  • qq_mmfish_agimA4
    qq_mmfish_agimA4
    雖然Symbol()是唯一的 但是它要作為對象的屬性名 還是需要用一個變量去標識 如果這個變量重復了呢
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

let json = {}

for (let index = 0; index < 11; index++) {

  let ss = Symbol()

  json[ss] = 'ssss'+index

}

console.log(json[Object.getOwnPropertySymbols(json)[3]]) // ssss3


查看完整回答
反對 回復 2019-04-03
  • 3 回答
  • 0 關注
  • 805 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號