为什么我可以使用数组访问对象属性?

5

有人能解释一下以下代码的行为吗?

let obj = {a:1, b:2}
let i = ['a']
console.log(obj[i])
>> 1

为什么甚至可以使用数组来访问对象内的属性? 顺便提一下,这仅适用于长度为1的数组。 我已经尝试过调查,但据我所知没有文件说明为什么应该起作用。

2个回答

9

属性名始终是字符串或符号

如果传入的不是字符串或符号,则会被转换为字符串。

数组上的默认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]);

(请注意,做一些非常奇怪的事情通常是一个愚蠢的想法,会使您在两周后很难调试自己的代码)。

0

让 obj = {a:1, b:2}

首先,您声明了一个带有两个属性 a 和 b 的对象,它们的值分别为 1 和 2。

让 i = ['a']

然后声明了一个变量 i,它的值设置为一个包含单个元素 'a' 的字符串数组。

console.log(obj[i])

在这个语句中,i的值被解析为一个字符串,因为数组只包含一个元素,正如你所提到的。因此,'a'是obj的有效属性名称,因为所有对象属性都是字符串,如果你传递像数组这样的东西,它会被转换为一个字符串。
如果你引用包含多个元素的数组变量i,并且它不能解析为单个属性名称,除非你更加明确,例如obj[i[0]]。如果你只有一个值,它将解析为该值。 obj['a']是一个有效的属性 obj['a,b']不是。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接