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

时间:2019-03-12 11:04:27

标签: javascript arrays object

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

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

为什么连一个数组都可以用来访问对象内部的属性?附带说明,这仅适用于长度为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]);

(请注意,做一些真正奇怪的事情通常是一个愚蠢的主意,这使得两周后很难调试自己的代码)。