【发布时间】:2020-04-13 15:24:56
【问题描述】:
似乎我对 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("============================");
【问题讨论】:
-
你读过例如developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…? “属性名称是字符串或符号。任何其他值,包括数字,都被强制转换为字符串。”
-
@jonrsharpe 不,我没有...只有书籍(其中一些 15 年前根本没有符号)...其中一些(即使是最近的)考虑了这一点信息太基本,直接跳过提及
Symbol。他们只是谈论属性名称,很自然地假设名称是字符串和字符串。这就是造成我困惑的原因。这个链接似乎正是我需要的!谢谢。 -
@Victor - 这就是 devtools 向您展示的方式,因为您可以在对象文字中使用数字文字作为键名 - 但生成的属性键是一个字符串。试试这个:
for (const key in {1:1}) { console.log(`${key}: ${typeof key}`); }(同样,请参阅下面的答案,这些答案是指规范的相关部分。) -
@T.J.Crowder 哇!你是对的......感谢您花时间(和耐心)指出这一点。顺便说一句:我之前赞成你的答案(目前,唯一的一个......绝对值得更多赞成)imgbbb.com/image/L4PIlH
-
@Victor - 我的荣幸。 :-) 如果您对添加到 JavaScript 中的新内容感兴趣,我将在明年初出版一本书——我的个人资料中的链接。 :-) 编码愉快!
标签: javascript ecmascript-6 computed-properties