2 回答

TA貢獻1887條經驗 獲得超5個贊
方括號:
jsObj['key' + i] = 'example' + 1;
在JavaScript中,所有數組都是對象,但并非所有對象都是數組。主要區別(以及難以模仿直接JavaScript和普通對象的那個)是數組實例維護length
屬性,以便它反映一個加上名稱為數字的屬性的數值以及轉換為數字時的值,是所有這些房產中最大的。這聽起來很奇怪,但它只是意味著,給定一個數組實例,有相似的名字屬性"0"
,"5"
,"207"
,等等,都在他們的存在決定的價值被特殊處理length
。而且,最重要的是,length
可以設置值來刪除這些屬性。將length
數組設置為0
有效地刪除名稱看起來像整數的所有屬性。
好的,這就是使數組特殊的原因。但是,所有這些都與JavaScript [ ]
運算符的工作原理無關。該運算符是一個對象屬性訪問機制,適用于任何對象。在這方面需要注意的是,就簡單的屬性訪問而言,數值數組屬性名稱并不特殊。它們只是看起來像數字的字符串,但JavaScript對象屬性名稱可以是您喜歡的任何類型的字符串。
因此,[ ]
運算符在for
循環遍歷數組的循環中的工作方式:
for (var i = 0; i < myArray.length; ++i) { var value = myArray[i]; // property access // ...}
與[ ]
訪問名稱為某個計算字符串的屬性時的工作方式沒有什么不同:
var value = jsObj["key" + i];
該[ ]
運營商有這樣做恰恰在這兩種情況是一樣的。換句話說,在一種情況下,所涉及的對象恰好是一個數組是不重要的。
使用設置屬性值時[ ]
,故事是相同的,除了維護length
屬性的特殊行為。如果在數組實例上使用數字鍵設置屬性:
myArray[200] = 5;
然后(假設“200”是最大的數字屬性名稱)該length
屬性將更新201
為屬性賦值的副作用。但是,如果對普通對象做了同樣的事情:
myObj[200] = 5;
沒有這樣的副作用。數組和對象的名為“200”的屬性將以5
完全相同的方式設置為值。
有人可能會認為,因為這種length
行為很方便,所以你也可以創建Array構造函數的所有對象實例而不是普通對象。這沒有什么直接的錯誤(雖然它可能會讓人感到困惑,特別是對于熟悉其他語言的人來說,有些屬性要包含在其他屬性中length
而不包含在其他屬性中)。但是,如果您正在使用JSON序列化(這是一個相當常見的事情),請了解數組實例以僅涉及數字命名屬性的方式序列化為JSON 。添加到數組的其他屬性永遠不會出現在序列化的JSON表單中。例如:
var obj = [];obj[0] = "hello world";obj["something"] = 5000;var objJSON = JSON.stringify(obj);
“objJSON”的值將是一個包含just的字符串["hello world"]
; “某物”財產將會丟失。
ES2015:
如果您能夠使用ES6 JavaScript功能,則可以使用計算屬性名稱來輕松處理:
var key = 'DYNAMIC_KEY', obj = { [key]: 'ES6!' };console.log(obj);// > { 'DYNAMIC_KEY': 'ES6!' }

TA貢獻1827條經驗 獲得超4個贊
JavaScript中的關聯數組與其他語言的實際工作方式不同。 for each
語句很復雜(因為它們枚舉了繼承的原型屬性)。您可以像Pointy提到的那樣在對象/關聯數組上聲明屬性,但實際上對于這種事情,您應該使用帶有該push
方法的數組:
jsArr = []; for (var i = 1; i <= 10; i++) { jsArr.push('example ' + 1); }
只是不要忘記索引數組是從零開始的,所以第一個元素是jsArr [0],而不是jsArr [1]。
添加回答
舉報