2011-01-24 74 views
1

我注意到當比較函數返回0時,IE9排序順序正在改變元素順序。IE9的JavaScript排序順序...爲什麼?

請參見:

var myarray=[ 
    {id:1,val:0}, 
    {id:2,val:0}, 
    {id:3,val:7}, 
    {id:4,val:41} 
]; 
myarray.sort(function(a,b){return a.val - b.val}); 

for(var i in myarray) 
{ 
    console.log(myarray[i].id); 
} 

目前的Chrome,Firefox,Opera和Safari瀏覽器的穩定版本得到了以下的輸出:1 2 3 4

IE7和IE8的輸出相同。

IE9輸出爲:2 1 3 4

爲什麼?這是正常的嗎?

+0

您使用的是哪個版本的IE9?這可能是一個較新的測試版已經改變了這種行爲。 –

+0

只需按值將其作爲主要進行排序,並在'0'的情況下按ID進行排序。 – Raynos

+1

你確定它是'sort'而不是'for-in'嗎? 'for-in'不能保證任何特定的順序,所以它不應該用於數組。 – user113716

回答

3

MDC(重點煤礦):

如果的compareFunction(A,B)返回0,離開a和b不變相對於對方,但對於所有不同的元素進行排序。 [注意:ECMAscript標準不保證此行爲],因此並非所有瀏覽器(例如,至少可以追溯到2003年的Mozilla版本)都尊重這一點。

以我的經驗,只有Chrome/Firefox得到這個權利。 Opera 11對我的行爲是......沒有很好的定義。

例如,使用排序爲全零移動到陣列的頂部:

[1, 0, 3, 0, 5, 0, 2].sort(function (a, b) { return b === 0 && 1 || 0;}); 
  • 鉻10:[0,0,0,1,3,5,2]
  • 火狐4:[0,0,0,1,3,5,2]
  • Opera 11:[0,0,2,1,5,3] < - 不保持非零的順序
2

根據您的排序功能,o f這些元素是平等的,它們出現在什麼順序並不重要。瀏覽器要麼保持原樣,要麼根據需要切換順序......既不是保證。

如果兩者不相等,那麼您的排序功能是不正確的,並應考慮其他項目。

4

如果你想遍歷數值屬性,原因有兩個陣列上不要使用for...in

  • 您也將獲得方法和屬性添加到Array.prototype顯示出來;
  • 迭代順序在ECMAScript規範中定義爲依賴於實現,這意味着它在理論上可以是任何東西。

這兩點也適用於Object s。 Chrome實際上並不符合最常見的瀏覽器行爲,導致heated debate in a Chrome bug report

相關問題