2010-07-30 55 views
5

正如我所想,JS數組只是一個只接受整數值作爲鍵的哈希映射。 .length屬性只返回最大索引+1。JavaScript數組和對象除.length屬性之外有什麼區別?

這是正確的嗎?還有其他的區別嗎?

+0

你是指'[]'和'{}'之間的區別嗎? – 2010-07-30 12:22:38

+0

沒有。不是關於語法。我在談論行爲和實施。 – Eonil 2010-07-30 12:47:05

回答

1

的區別是:

Object.prototype.toString.call([]); // [object Array] 
Object.prototype.toString.call({}); // [object Object] 

編輯:

而且,看看從ECMAScript的規範這部分,因爲它恰恰說明了一個數組是什麼:http://bclary.com/2004/11/07/#a-15.4

+0

只是我發現的信息。現在我可以將Array視爲一個has-table,而不是C風格的數組。謝謝。 – Eonil 2010-07-30 13:09:34

+0

..爲什麼你會投票呢? – rochal 2010-08-01 14:03:25

3

你錯了;數組可以有你想要的任何鍵。

另外,它們繼承了Array原型。

+1

嗯,我不會說陣列可以有任何鍵。我認爲整數鍵以特殊方式處理,而如果使用另一個鍵,如字符串,則只需使用數組也僅僅是一個對象的事實。這與OP已經說過的'Array.length'一起反映出來。 – 2010-07-30 12:29:16

+0

@Felix:整數鍵唯一可見的特殊處理是'length'屬性。儘管實現可以優化整數鍵的使用,但這種優化必須沒有副作用。 – SLaks 2010-07-30 12:40:45

+0

因此,將Array視爲哈希映射的特例似乎是安全的。 – Eonil 2010-07-30 12:50:12

1

JavaScript Array也繼承Object,所以它將獲得對象的所有功能。 JavaScript數組有,雖然附加功能:

var myA = ['foo', 'bar', 'baz']; 
var myO = {0: 'foo', 1: 'bar', 2: 'baz'}; 

// these both give us "foo": 
console.log(myA[0]); 
console.log(myO[0]); 

// array has additional methods, though: 
console.log(myA.pop()); 
console.log(myO.pop()); // <- error 

雖然可以增加整數性能定期對象,並添加非整數屬性數組,這不會給對象的特殊屬性和方法數組和數組的特殊功能僅適用於其整數鍵屬性。

對數組繼承的所有額外屬性的一個很好的參考是Mozilla Developer Center article on Array。如果你想保持跨瀏覽器的兼容性,請確保你注意一點「非標準」和「需要JavaScript 1.x」的注意事項。

+0

myO.pop = function(){return「ne ne ne ne,我也可以彈出!」 }; - 在這裏你去,一個對象(不是數組),完美的工作.pop()。你的代碼不能證明任何東西。 – rochal 2010-07-30 13:02:28

0

Array對象可以擁有對象可以擁有的任何屬性。 唯一的特殊屬性是當您設置「數組索引」屬性時(可能)更新的「length」屬性,並且如果設置爲比當前值更小的值,也可以用於刪除數組元素。

「數組索引」是字符串(所有對象屬性都是),它是範圍爲0..2^32-2(即「0」到「4294967294」)範圍內的無符號整數的標準十進制表示形式。 該限制低於32位無符號值的最大值,因爲長度字段值始終是無符號的32位整數值。

數組對象也從Array.prototype繼承(但如果需要,也可以使其他對象也這樣做),並且它們的內部類是「Array」。

即,在實踐中,數組和普通對象實例之間的唯一區別是「魔法長度屬性」。如果你不需要這些,你應該只使用一個對象。

+0

myObject.length = function(){return 12}; - 很酷,我現在是一個陣列。再次 - 你的文章沒有證明任何內容,你說的只是錯誤的。 – rochal 2010-07-30 13:14:53

相關問題