通过括号表示法访问对象 属性 而不管括号的个数
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(",")]);
可以通过执行以下操作通过括号表示法访问对象的属性:
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(",")]);