2016-02-17 38 views
4

我看到這些片段在this MDN的文檔顯示的填充工具:JavaScript中的值(值不等價值)是什麼?

// Casts the value of the variable to a number. 
// So far I understand it ... 
count = +count; 
// ... and here my understanding ends. 
if (count != count) { 
    count = 0; 
} 

我毫無目的的想法。

本身如何能不平等?

回答

5

在JavaScript中NaN是唯一不等於自身的值。所以這是對NaN的檢查。

4

這是測試時計數爲NaN,因爲只有NaN != NaN

+1

優秀的解釋,但我很好奇。用'isNaN()'方法檢查它不是更好嗎? –

+0

'{}!= {}'怎麼辦? – Jai

+0

@MarcosPérezGude我認爲,以防萬一某些瀏覽器不具備該功能。 – jcubic

2

其他答案已經提到了爲什麼需要此檢查。但是如果期望值是一個虛假值,如NaN,還有另一種方法來分配默認值。

如果如果你有這將不需要的條件:

count = +count || 0; // so if count = NaN which is a falsy value then 0 will be assigned. 
+0

不錯的捷徑,但我認爲OP有興趣_why_這樣的檢查存在於第一位。 –

+1

@JohnWhite實際上,我在答案中已經提到過,但由於是由其他人發佈的,所以我將其刪除。 – Jai

0

我會試着總結一下什麼已經表示,如果

if (count != count) { 

檢查countNaN。按照specs

來測試的ECMAScript代碼中的可靠方法,如果值X是NaN的形式X的表達== X.結果爲真當且僅當X是! NaN的。

(這種情況並不重要,但是polyfill使用!=而不是標準要求的!==)。

您可能會問,爲什麼不使用isNaN?因爲isNaN沒有做它的名字所暗示的 - 它不檢查值是否爲NaN,它檢查值在轉換爲數字時是否爲NaN。例如,"foo"顯然不是NaN,仍然isNaN("foo")將是True。相反,isNaN([[1]])False,儘管[[1]]不是有效的數字。

count = +count || 0怎麼樣?這是一條有效的捷徑,但MDN polyfills儘可能接近標準。 spec for String.repeat說:

讓n是ToInteger(count)。

其中ToInteger

設數爲ToNumber(參數)。

...

如果number是NaN,則返回+0。

注意,它並沒有說「叫isNaN」,它說:「如果數 NAN」,和辦法,找出與自身比較number

另一種選擇是Number.isNaN,與全球isNaN不同,它不強制它的論點。當且僅當x是實際上爲NaN

Number.isNaN("foo") => false 
Number.isNaN([[11]]) => false 
Number.isNaN(0/0) => true 

所以神祕的比較操作if (count !== count)可以if (Number.isNaN(count))更換Number.isNaN(x)將返回true。