2016-11-08 113 views
2

我正在做一些JavaScript比較。我複製像這樣的代碼:數組是否有一個元素等於元素?

if (input.val() != input.data('original')) 
    //do stuff 

我希望我將不得不改變一些東西,因爲在這種情況下input<select multiple>與限制爲1可選擇的選項號碼,但工作沒有變化。

我檢查,事實證明:

13 == [13] //true 
13 === [13] //false 

我沒想到的是,比較會解開的陣列。

這是我可以使用和依賴的JavaScript中的一個預期和記錄的功能嗎?或者這隻對我有用,因爲一些瀏覽器開發人員決定使其工作?

+1

見規格的''==。這是你應該總是使用'==='代替的許多原因之一。 – SLaks

+0

parseInt(13,10)=== 13'對於'+ [13]'是相同的,所以強制該數組返回'13',並且比較非嚴格的類型強制 – adeneo

+0

@SLaks我不能找到它,'=='不是最可以googleable的字符串。谷歌搜索'JavaScript比較'我找不到明確說明這種行爲的資源。 –

回答

2

loose equality (==)用於比較ObjectNumber

它試圖其對象參數轉換爲原始值,通過嘗試>調用A.toString和A的變化的序列上的一個

的valueOf方法,這樣你實際上這樣做,得到:

13 == [13] 

是:

13 == ([13].toString().valueOf()) 
0

這就是javascript的工作原理。 5 == '5' == true。 5 == [5]也是如此。

看看這些例子。 http://www.w3schools.com/js/js_comparisons.asp \

在進行任何必要的類型轉換之後,==運算符將進行比較以獲得相等性。 ===運算符不會執行轉換,所以如果兩個值不是相同的類型===將簡單地返回false。

==都將值轉換爲同樣的類型,然後更在這裏使用相同的比較,因爲=== 閱讀關於如何==改建工程和圖表。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

+0

我沒有看到任何關於'[5]'或您鏈接的資源中的轉換。 –

+0

@Juris我連接到例子。我解釋瞭如何在鏈接之後使用'=='進行類型轉換。 –

+0

如何選擇「必要」轉換以及在不同情況下選擇哪種轉換?你知道這是否記錄在任何地方? –

3

不,這取決於,如果元素是一個字符串或不是。

帶有一個元素的結果是toString方法的結果,它看起來像一個元素與元素相等。但結果總是一個字符串,而該值可能不是一個字符串。

與陣列

array toString value 
------- -------------- 
    [1]    '1' 
[1, 2]   '1,2' 

爲評價順序例如,您可能看一下標準ECMA 262 Version 5.1

Equality == (MDN)

等於運算符轉換,如果操作數他們不是山姆的e型,然後進行嚴格比較。如果這兩個操作數都是對象,那麼當操作數引用內存中的同一對象時,JavaScript會比較內部引用相等。

+0

那麼'=='每次都使用'toString'嗎?或者在某些特定情況下? –

+0

不,命令是檢查是否可以進行嚴格比較,然後檢查'toString'方法的值。 –

相關問題