2012-04-21 48 views
4

我的問題是一樣的Are Javascript arrays sparse?有一點不同......Node.js中JavaScript/ECMAScript數組是否「稀疏」?

是JavaScript數組稀疏,如Node.js的(和/或V8)實施?我曾以爲的是,後來我做了以下測試:

var testArray = []; 
testArray[10000] = 'test'; 
console.log(testArray); 

回國爲10000空白元,並在後面加上「測試」。這是因爲調試輸出的工作方式,還是Node.js在添加新元素時實際爲未定義的數組元素分配內存?

+1

控制檯不是該語言的一部分。控制檯如何決定代表什麼東西對實際的東西沒有影響。 – 2012-04-21 00:52:23

+0

@amnotiam,我意識到這一點,這就是爲什麼我的問題是我看到的控制檯輸出是否是由於控制檯的格式化或對象實際存儲的方式。丹尼斯回答了這個問題。 – Brad 2012-04-21 01:34:40

回答

2

節點的util.inspect函數專門檢查稀疏數組以便像那樣打印它們。其實它有a test that specifically checks for it。我知道這一點,因爲我完全重寫了節點的檢查員,最終沒有把它變成核心,並導致我的UltraREPL

+0

不錯的工具!我一定會下載它。而且,謝謝你的回答並參考單元測試。 – Brad 2012-04-21 05:18:05

5

你所看到的不是一個實際的數組,而只是一種表示。控制檯檢查是否存在lengthsplice屬性,並打印該對象的數字屬性,這就是爲什麼jQuery集合在記錄時顯示爲數組的原因。

function RandomThingThatIsDefinitelyNotAnArray() { 
    this.splice = function() {}; 
    this.length = 10; 
    this[5] = 5; 
} 

console.log(new RandomThingThatIsDefinitelyNotAnArray());​ 
// shows [undefined, undefined, undefined, undefined, undefined, 5] 

jsfFiddle了現場演示。

+0

+1我想知道更多。你有沒有任何關於爲什麼它會返回一個類似數組的結構而不是一個對象的引用? 'length'和'splice'是創建一個類似數組的數組結構所需的唯一東西嗎? – Joseph 2012-04-21 00:35:23

+1

內部結構確實沒有什麼不同,控制檯只是以不同的方式顯示。 [搜索isArray](http://fbug.googlecode.com/svn/lite/branches/firebug1.4/build/firebug-lite-debug.js)查看數組的資格,就控制檯而言關心。這是Firebug代碼,但據我所知,Chrome使用相同的標準。 – Dennis 2012-04-21 00:46:51