2011-01-24 20 views
7

Array.prototype.sort如何處理數組中的未定義值?帶有未定義值的javascript array.sort

var array = [1,undefined,2,undefined,3,undefined,4]; 
var array2 = []; 
array2[0] = 1;array2[2] = 2;array2[4] = 3;array2[6] = 4; 

當調用array.sort(function(l,r) { ... });undefined從來沒有傳過來lr

我可以保證所有未定義的值將始終保留在所有瀏覽器的數組末尾嗎?

請問下面的循環處理數組中的

array.sort(); 
for (var i = 0; array[i] !== undefined; i++) { 
    // handle array 
} 

你可以假設,沒有人宣稱undefined爲變量的所有非undefined數據。

+2

在IE <= 8時只刪除undefined屬性,他們會從完全陣列被移除。請參閱:https://github.com/documentcloud/underscore/issues/484#issuecomment-4055242 – Gijs 2012-03-23 11:16:21

回答

7

是的,你可以放心地假設undefined將被移動到數組的末尾。

MDC

在JavaScript 1.2,這種方法不再未定義元素轉換爲null;而是它們排序到陣列

的高端從spec, 15.4.4.11

因爲不存在的屬性值總是比較比未定義的屬性值時,和 未定義總是比較比任何其他更大的值,未定義的屬性值總是排序到結果的末尾, 後跟不存在的屬性值。

+0

謝謝。對於它們來說,不存在僅僅是因爲在數組中沒有包含未定義值的「間隙」。請爲規範的鏈接添加某種節或頁碼。 – Raynos 2011-01-24 14:46:53

0

所有未定義的值都會到達數組的末尾,而不管它們在聲明中的順序如何。 (至少這是它在Chrome的js引擎中的工作原理)

0

看來未定義的值將會落在列表的底部。以下是一些示例代碼,以向您展示發生了什麼:

var a = [1,undefined,2,undefined,3,undefined,4]; 
    a = a.sort(); 
    for(i = 0 ; i < a.length ; i++) 
    { 
    alert(a[i]); 
    } 

這當然是JavaScript的默認行爲。如果您覆蓋默認行爲,那麼只有您會知道。

-3

Safari瀏覽器調用sort();方法