2012-08-29 263 views
2

克羅克福德寫入在http://javascript.crockford.com/survey.html

「有兩種方法可以使一個新的數組:

變種myArray的= [];
變種myArray的新=陣列();」
對象對象是否可以強制轉換爲數組對象?


所以我通過這兩條線在一些AJAX代碼我讀困惑:

var obj={}; // obj is an Object object (i.e. a hash table) 
obj[4] = 'x'; // now obj is suddenly an Array object via an integer key? 

在JavaScript中的對象和數組實際上只是同樣的事情,但在關鍵類型上有變體?

換句話說,這是否與在PHP中,我們可以使用要麼一個名稱(字符串)或一個整數的散列鍵?

我已經谷歌搜索這個答案,但似乎無法指出一篇文章,討論這個問題。

想到一種可能性,可能是第一行是語法lint,因爲第二行覆蓋了obj的前一個定義,因爲它會創建一個新的Array對象。

+0

所以看來4強制轉換成在這方面的字符串。謝謝Felix和agreco。 –

+0

即使數組鍵也被轉換爲字符串,因爲屬性名稱(鍵/ ...)始終是一個字符串。 –

+0

這是我第一次成功的Q,我對這個快速而全面的迴應感到驚訝。謝謝所有回答的人。 –

回答

0

就我所知,不,一個對象不能被強制到一個數組中。 但是,它可以看起來和行爲像一個數組,這就是發生在這裏。數字,和其他任何可以強制轉換爲字符串,是完全對JavaScript對象有效的屬性名稱,所以

obj[4] = 1; 
obj['spam'] = 2; 

是在對象上設置屬性的兩種有效途徑。這不會使對象成爲數組。數組是一種特殊的對象類,它具有特定方法(.slice().concat()等)和length屬性,該屬性與數組中項目的數量保持同步。

1

它不會成爲一個數組,這是簡單地用一個「4」屬性的對象,這樣的:

var obj = { 
    '4': 'x' 
}; 

obj['4'] = 'x';

1
一個屬性使用時它僅僅是轉換爲字符串

除了原始數據類型以外的所有東西都是JavaScript中的一個對象。對象可以有一個特性,有兩種方式來訪問對象的屬性:

  1. 點符號,foo.bar,你可以只要屬性名稱是有效的標識符使用。

  2. 括號符號,foo['bar']如果密鑰不是valid identifier [spec],您必須使用它。例如,如果它是一個數字,或者包含一個空格或者你有一個帶有名字的變量。

因此,括號表示法是陣列的特性,並且如果你看到它,這並不意味着該值是一個數組。訪問屬性的兩種方法之一很簡單。

數組的元素是隻用數字鍵的性質。數組構建在對象之上,並實現一些以特殊方式處理這些數值屬性的附加方法。例如,添加新元素時,.length屬性會自動更新。但最終他們只是普通的屬性。

在您的例子,你有一個簡單的對象。您必須使用obj[4]obj['4']訪問該屬性,因爲obj.4無效,因爲4不是有效標識符(基本上,您可以用作變量名稱的所有內容都是有效標識符,​​無效)。

而且由於數組只是對象,所以如果您使用可以使用數字作爲標識符,您還可以使用arr.4訪問元素。

0

JavaScript是弱類型,基於原型的語言。即使是原始類型,如布爾型可以將視爲對象(though you aren't going to get far)。在JavaScript中,幾乎所有東西都是一個對象。

瞭解此,陣列是一個對象。您可以任意添加屬性到任何對象:

var xml = new XMLHttpRequest(); 
xml[4] = 'x'; 
console.log(xml); 

該對象仍然是XMLHttpRequest的一個實例。它現在有一個標記爲4的財產,其值爲x。您可以治療這樣的事 - 即使是功能:

var test_func = function() { 
    alert('woah!'); 
} 
test_func[4] = 'x'; 
console.log(test_func[4]); 

外賣這裏就是obj[key] = value符號並不表示一個「陣列」式的,像它在語言如PHP。相反,它是訪問任何對象的屬性的替代方法,相當於obj.key = value(但不能使用obj.4 = 'x',但這是無效的語法)。另一個外帶是JavaScript中的任何對象都可以被修改或以任何方式使用。您不應該濫用對象,但你可以

看看這裏:http://jsfiddle.net/w2AqJ/

文檔

0

JavaScript數組是由傳統陣列非常不同的,你可以把它作爲目標。

var array = [1,2,3] is equivalent to var object = {'0' : 1, '1' : 2, '2' : 3} 

除了陣列從Array.prototype繼承和從Object.prototype中,其中Array.prototype將包含方法如長度對象繼承。

+0

您忘記了數組的長度屬性 – Bergi

相關問題