有人可以解释以下代码的行为吗?
let obj = {a:1, b:2}
let i = ['a']
console.log(obj[i])
>> 1
为什么连一个数组都可以用来访问对象内部的属性?附带说明,这仅适用于长度为1的数组。我曾尝试对此进行研究,但据我所知,目前还没有文档解释为什么这应该起作用。
答案 0 :(得分:9)
属性名称始终是字符串或symbols。
如果传递的内容不是字符串或符号,则会将其转换为字符串。
数组上的默认toString()
方法大致为:
String.prototype.toString = function () { return this.join(","); }
因此['a']
被转换为'a'
。
请注意,这仅适用于长度为1的数组。
它对于更长的数组可以正常工作。您只需要一个匹配值:
const o = {
"a,b": "Hello"
}
const a = ["a", "b"];
console.log("" + a);
console.log(o[a]);
由于任何对象都可以转换为字符串,并且可以自定义toString
方法,因此您可以做一些奇怪的事情:
const data = {
"42": "Hello"
}
class Weird {
constructor(x) {
this.x = x;
}
toString() {
return this.x + 40;
}
}
const w = new Weird(2);
console.log(data[w]);
(请注意,做一些真正奇怪的事情通常是一个愚蠢的主意,这使得两周后很难调试自己的代码)。