通过括号表示法访问对象 属性 而不管括号的个数

Accessing object property through bracket notation regardless of the number of brackets

可以通过执行以下操作通过括号表示法访问对象的属性:

let obj = {a: "test"}

obj["a"]

但是,我不知道同一个对象的 属性 也可以通过以下方式访问:

let v = ["a"] // An array

obj[v]

obj[["a"]]

obj[[[[[[[[[["a"]]]]]]]]]]

只是想知道,这是为什么?

我在将数组存储到变量中并错误地使用 variable/array 而不是数组的第一项来访问对象的 属性 之后偶然发现了这种行为,令人惊讶的是......它没有抛出错误但返回了值。

console.log(['a'].toString()); // "a"

因为键必须是字符串,javascript 类型强制转换,自动将数组转换为字符串。

所有对象键都是字符串。当您使用括号表示法 foo[bar] 时,您尝试获取的变量将被转换为字符串:

const bar = {
  toString() {
    return "hello";
  }
}

const foo = {
  hello: "world"
}

console.log(foo[bar]);

当数组转换为字符串时,join(",") 被隐式调用。如果数组只有一个值,则结果是作为字符串的单个值:

const arr = ["hello"];

console.log(arr.toString());
console.log(String(arr));
console.log(arr.join(","));

如果你有嵌套数组,每个数组都有一个项目,你仍然会从转换中得到一个字符串,因为 join() 也会将所有成员转换为字符串,所以 String([["hi"]])你(大致)得到:

[["hi"]].join(",") -> String(["hi"]) -> ["hi"].join(",") -> String("hi")

因此,如果您提供一个数组作为键,只要您在每个数组中只有一个值,它就可以工作:

const foo = {
  hello: "world"
};

const arr = [[["hello"]]];

console.log(foo[arr]);
console.log(foo[String(arr)]);
console.log(foo[arr.toString()]);
console.log(foo[arr.join(",")]);