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)

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

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
添加回答
舉報