2016-10-03 64 views
3

任何人都可以解釋是Chrome中的錯誤還是錯誤地比較字符串?JavaScript:Chrome不正確地比較字符串

Chrome中的排序方法提供了奇怪的結果(至少對我而言)。 我做到以下幾點:

var a = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"] 

a.sort((i1,i2)=>i1>i2) 

["7", "c", "b", "a", "9", "8", "6", "5", "4", "3", "2", "1"] 

火狐給出預期的結果:

["c", "b", "a", "9", "8", "7", "6", "5", "4", "3","2","1"] 

回答

5

這是一個錯誤在你sort的回調,而不是JavaScript引擎。

回調必須返回一個,而不是一個布爾值:

  • 0如果參數是等價的
  • <0如果第一個參數是「小於」第二
  • >0如果第二個參數是「小於」第一個

localeCompare便於獲取正確的返回值,如果您希望按自然排序中的字符串比較以升序排列數組。在你的情況,不過,你想要的對面,所以否定它:

var a = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c"] 
 
a.sort((i1, i2) => -i1.localeCompare(i2)); 
 
console.log(a);

...或(DOH)只是做i2.localeCompare(i1)代替。

+0

@evolutionxbox :-) –

+0

我以爲這是一些祕密知識,我不知道= P – evolutionxbox

2

您的排序比較功能不符合合同。如果第一個參數應該在第二個參數之前排序,則排序比較器應該返回一個負數;如果第二個參數應該排在第一個之前,排序比較器應該返回一個正數;如果參數已經按照可接受的順序排序,則爲0

你的函數返回一個布爾值,它將被解釋爲01。這意味着當排序操作以不同順序調用相同的兩個值時,該函數可能會返回衝突的結果。

考慮列表中的兩個值「a」和「b」。如果排序操作調用回調函數是這樣的:

var ordering = yourCallback("a", "b"); // not really how it looks of course 

那麼你的回調將返回0,和排序功能會解釋,由於這意味着兩個值都已經正常。如果以後調用像功能:

var ordering = yourCallback("b", "a"); 

它會得到1。這與相同兩個參數的第一個結果不一致。

該語言的規範沒有規定使用什麼算法來實現.sort(),Firefox和Chrome中的JavaScript運行時在它們如何響應異常排序比較函數的細節上明顯不同。