簡體   English   中英

無論括號的數量如何,通過括號表示法訪問 object 屬性

[英]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"]]]]]]]]]]

只是想知道,這是為什么呢?

在將數組存儲到變量中並錯誤地使用變量/數組而不是數組的第一項來訪問對象的屬性后,我偶然發現了這種行為,令人驚訝的是……它沒有拋出錯誤,而是返回了值.

所有 object 鍵都是字符串。 當您使用括號符號foo[bar]時,您嘗試獲取的變量將被轉換為字符串:

 const bar = { toString() { return "hello"; } } const foo = { hello: "world" } console.log(foo[bar]);

當 arrays 轉換為字符串時,會在它們上隱式調用join(",") 如果數組只有一個值,則結果是字符串形式的單個值:

 const arr = ["hello"]; console.log(arr.toString()); console.log(String(arr)); console.log(arr.join(","));

如果你嵌套了 arrays,每個都有一個項目,你仍然會從轉換中得到一個字符串,因為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(",")]);

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

這是因為一個鍵需要是一個字符串,並且 javascript 確實類型強制,將數組自動轉換為字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM