我會試着總結一下什麼已經表示,如果
if (count != count) {
檢查count
是NaN
。按照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。
優秀的解釋,但我很好奇。用'isNaN()'方法檢查它不是更好嗎? –
'{}!= {}'怎麼辦? – Jai
@MarcosPérezGude我認爲,以防萬一某些瀏覽器不具備該功能。 – jcubic