有人能解释一下以下代码的行为吗?
let obj = {a:1, b:2}
let i = ['a']
console.log(obj[i])
>> 1
为什么甚至可以使用数组来访问对象内的属性? 顺便提一下,这仅适用于长度为1的数组。 我已经尝试过调查,但据我所知没有文件说明为什么应该起作用。
有人能解释一下以下代码的行为吗?
let obj = {a:1, b:2}
let i = ['a']
console.log(obj[i])
>> 1
为什么甚至可以使用数组来访问对象内的属性? 顺便提一下,这仅适用于长度为1的数组。 我已经尝试过调查,但据我所知没有文件说明为什么应该起作用。
属性名始终是字符串或符号。
如果传入的不是字符串或符号,则会被转换为字符串。
数组上的默认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]);
让 obj = {a:1, b:2}
首先,您声明了一个带有两个属性 a 和 b 的对象,它们的值分别为 1 和 2。
让 i = ['a']
然后声明了一个变量 i,它的值设置为一个包含单个元素 'a' 的字符串数组。
console.log(obj[i])
obj[i[0]]
。如果你只有一个值,它将解析为该值。
obj['a']
是一个有效的属性
obj['a,b']
不是。