2012-03-31 140 views
29

數組默認情況下具有「length」屬性。將屬性添加到javascript數組

我可以向它們添加自定義屬性嗎?

不必使它們成爲物體

+2

你是什麼意思*「添加自定義屬性,而不必使它們成爲對象?」*數組是ARE對象。幾乎所有的JS都是一個對象。這些屬性是什麼?你能進一步解釋嗎? – Joseph 2012-03-31 01:10:25

+0

他們**是**物體。只是一種特殊的物體。像函數一樣,它也是一種特殊的對象。 – ThiefMaster 2012-03-31 01:15:39

+0

另請參閱[此相關問題](http://stackoverflow.com/questions/24730145/what-are-the-drawbacks-of-setting-string-properties-on-arrays)爲什麼你不應該這樣做。 – 2014-07-14 07:14:05

回答

37

當然。

var arr = [1,2,3,4,5]; 
arr.prop = 'value'; 

數組是已經在JavaScript對象 - 他們只是有一些額外的功能和特殊的文字語法。

+0

將我的屬性迭代其餘的元素?因爲在console.log中,我沒有看到它帶有不透明的文本,如「長度」 – ellabeauty 2012-03-31 01:12:50

+5

當你使用'for(var key in arr)'時,它們將被迭代。但是這是你不應該在數組上使用的東西,所以它不應該成爲你的問題。如果你使用'for in'循環,'for(var i = 0; i ThiefMaster 2012-03-31 01:16:42

+0

將被迭代。在常規的'for'循環中,它不會 - 因爲你只能通過它的數組索引訪問每個成員。它也不會被像'forEach'這樣的本地數組ES5方法迭代。 – 2012-03-31 01:17:52

2

是的。您可以通過只宣佈他們將它們添加到對象,你也可以使用Array.prototype

var j = new Array(); 
j.yourprop = "foo"; 
+4

'var j = [];'更好。 – ThiefMaster 2012-03-31 01:17:02

+3

是的,我同意我的方式很爛 – 2012-03-31 01:21:26

+11

我更喜歡'var j =(function(array){return new array();}(window.Array))' – 2012-03-31 01:23:33

22

至於其他的答案狀態擴展陣列,這是完全可能的,因爲在JavaScript數組都只是對象。然而,這是否是一個好主意還存在一個問題。

這是一個「編碼風格」的問題,所以很難客觀地說,但道格拉斯克羅克福德沒有問題(至少在某些情況下)。在JavaScript: The Good Parts中,他實際上使用了將「全部」方法添加到數組的示例。

因爲數組實際上是一個對象,我們可以直接添加的方法,以一個單獨的陣列:

// Give the data array a total function 

data.total = function() { 
    return this.reduce(add, 0); 
}; 

total = data.total(); // total is 108 

由於串'total'不是整數,加入total屬性到一個數組不變化它的長度。

(P62,克羅克福德的「JavaScript的好的部分」,在Google Books發現)

然而,值得一提的是,這些額外的屬性不包括在JSON序列化,如果你這樣做會被扔掉像arr = arr.slice(1);之類的東西。

+0

感謝您的參考。 – 2015-01-29 17:51:52

+0

另外,如果數組經過其任何原型方法(映射,過濾器等),則該屬性將不會被轉移到新數組中,因爲該方法被放在'Array'的一個實例上。在這種情況下可能會有預期但可能不合意? – 2016-01-26 15:59:32

1

如果你打算把它藏在一個數組等? [至少這是我所期待的。]

Object.defineProperty(targ, "myVal", { enumerable: false, writable: true }); 

則數組不就那麼這是一個財產不是我想你可以說一個值添加到長度。

然後,如果您想查看對象中的鍵,Object.keys將不會看到它,但Reflect.ownKeys會。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys

的反映defineProperty的版本將返回成功或失敗,而對象的返回傳入的對象。

記住preventExtensions會(像它說的)阻止你或他人擴展它們。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/preventExtensions