Кажется, меня очень смущают вычисляемые свойства в JavaScript.
Когда я определяю объект и помещаю [d]
в качестве ключа (как ключ/имя свойства), что на самом деле делает этот [d]
? Кажется, что для некоторых значений d
он вычисляет s = d.toString()
и использует это значение s
в качестве ключа свойства. Но для других значений d
(например, когда d
является символом) он действительно использует значение символа в качестве ключа.
Таким образом, это двойное поведение [d]
(как синтаксической конструкции) кажется запутанным. Может ли кто-нибудь подробно объяснить, как это работает?
Кстати, есть ли другие особые случаи? Или это только когда d
является символом, когда у нас есть такое особое поведение?
Вернемся к основам: какие вещи могут быть ключами/именами свойств объекта? Это просто строки или только строки и символы, или есть еще что-то дополнительное...?
Пример:
var symbol = Symbol("test");
function Animal(name){
this.name = name;
}
Animal.prototype = {};
Animal.prototype.constructor = Animal;
function Dog(breed){
this.breed = breed;
this.name = "Dog";
this.s = symbol;
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
console.log("001");
var d = new Dog("Sharo");
for (let x in d){
console.log(x, ":", d[x]);
}
console.log("002");
d = new Object();
for (let x in d){
console.log(x, ":", d[x]);
}
console.log("003");
d = new Number(5);
for (let x in d){
console.log(x, ":", d[x]);
}
var d1 = {};
var d2 = {};
var d = new Dog("Sharo");
var m = {[d1] : 5, [d2] : 10, [d] : 20, z : 100, symbol: 2000, [symbol] : 5000};
console.log("============================");
console.log(m);
for (let x in m){
console.log(x, ":", m[x]);
}
console.log("============================");
Symbol
. Они просто говорят об именах свойств, и естественно предположить, что имена — это строки и только строки. Вот что вызвало мое замешательство. Эта ссылка, кажется, именно то, что мне нужно! Спасибо. - person peter.petrov   schedule 21.12.2019toString()
, как я догадался, или... каким-то другим способом? - person peter.petrov   schedule 21.12.2019ToPropertyKey
или...? - person peter.petrov   schedule 21.12.2019ToObject
, на которое ты указал мне первым. Спасибо еще раз. - person peter.petrov   schedule 21.12.2019for (const key in {1:1}) { console.log(`${key}: ${typeof key}`); }
(И, опять же, см. ответы ниже, которые относятся к соответствующим частям спецификации.) - person T.J. Crowder   schedule 21.12.2019