2014-10-17 25 views
24

爲什麼會出現一個isNaN()功能在JavaScript而isUndefined()必須寫成:爲什麼JavaScript中有isNaN()函數,但沒有isUndefined()?

typeof(...) != "undefined" 

有一點我不明白?

在我看來,它真的很難寫,而不僅僅是isUndefined(testValue)

+6

好問題。但我認爲這在Programmers SE(概念性的東西)中更好。此外,像Underscore這樣的實用程序庫有['_.isUndefined'](http://underscorejs.org/#isUndefined) – Joseph 2014-10-17 13:39:45

+4

在stackoverflow非常失望。沒有人煩惱完整地閱讀這個問題。 – simonzack 2014-10-17 13:47:00

+15

@simonzack這是一個愚蠢的問題。爲什麼*應該*有一個'isUndefined()'?爲什麼不是'isNull()'呢?或'isEmptyString()'?或者'is17()'就是這個問題? – Pointy 2014-10-17 13:48:36

回答

15

用例var === undefined幾乎無處不在的工作原理,除了由this answer,其中任undefined被分配一個值,或var未定義所覆蓋的情況。

這樣的功能可以不存在的原因,是由後者的情況下清晰。如果var未定義,則調用假設函數isUndefined(var)將導致ReferenceError。然而,引入新的關鍵字,例如isundefined var可以解決這個問題。

但儘管是有效的,上述兩種情況都是JavaScript的貧困用途。這是我相信這樣一個關鍵字不存在的原因。

+0

通過引用變量存在的現有作用域,您可以解決* if var是'undefined' *問題。如果變量是全局變量,我們可以通過傳遞'window.foo'或者window ['foo']'(其中'foo'是我們未定義的變量)而不是'foo'來檢查它是否是未定義的。這裏是我們的函數:'function isUndefined(val){return val === undefined; }',這裏是我們的測試:'isUndefined(window.foo);'結果將是'true',因爲沒有定義全局'foo'變量。 – 2014-10-17 14:17:38

+0

@JamesDonnelly這相當於'window.foo === undefined',其中imo並沒有真正回答這個問題,它要求'typeof'方法的替代方法。 – simonzack 2014-10-17 14:20:33

+9

'isUndefined()'不存在的原因是因爲它不是必需的。正如Pointy回答你對這個問題的評論,如果我們有一個'isUndefined()'爲什麼我們不會有'isNull()'或'is17()'。 isNaN()是必要的,因爲NaN值彼此不可區分。 'NaN'不等於'NaN'。 'undefined',另一方面,*等於undefined。 – 2014-10-17 14:23:04

3

isUndefined可以寫成

testValue === undefined 

像所有其他價值。

然而,這不適用於NaN,因爲NaN !== NaN。如果沒有使用比較的能力,則需要使用isNaN函數來檢測NaN值。

27

根本不需要isUndefined()功能。這背後的原因是在ECMAScript specification解釋:

(注意,NaN的值由程序表達的NaN產生)。在一些實施方式中,外部代碼可能能夠檢測各種不-A之間的差 - 數值,但是這種行爲是依賴於實現的;到ECMAScript代碼,所有NaN值彼此難以區分

isNaN()功能作爲一種方法來檢測是否東西是NaN因爲平等運營商不工作(如你所期望,見下文)就可以了。一個NaN值不等於另一個NaN值:

NaN === NaN; // false 

undefined,另一方面是不同的,undefined值有區別的:

undefined === undefined; // true 

如果您想知道如何isNaN()功能起作用,ECMAScript規範also explains this for us也:

  1. 讓num爲ToNumber(數字)。
  2. ReturnIfAbrupt(num)。
  3. 如果num是NaN,則返回true。
  4. 否則,返回false。

爲ECMAScript的代碼來測試一個值是否X是NaN的形式X的表達的可靠方式!== X的結果將是當且僅當X是NaN。

NaN !== NaN; // true 
100 !== 100; // false 

var foo = NaN; 
foo !== foo; // true 
+2

NaN === NaN'爲false實際上正是你爲什麼不需要'isNaN'的原因。正如你所引用的文檔所說的那樣,測試'NaN!== NaN'就足夠了。因此,說'isUndefined()'不存在是沒有用的,因爲它不是必需的,因爲'isNaN()'確實存在並且完全沒有用處。 – 2014-10-17 15:26:57

+11

@LightnessRacesinOrbit不是真的。爲了比較'NaN','isNaN()'函數將該值與自身進行比較。調用'isNaN(myReallyLongObject.myReallyLongVariableName)'比調用'myReallyLongObject.myReallyLongVariableName!== myReallyLongObject.myReallyLongVariableName'更加可取。使用'undefined',你只需'myReallyLongObject.myReallyLongVariableName === undefined'。該檢查不是'variable!== NaN',它是'variable!== variable'。這會讓事情變得混亂,而'isNaN()'方法會告訴你到底是在檢查什麼。 – 2014-10-17 15:29:33

+0

@詹姆斯,你應該添加最後一部分給你的答案。至於爲什麼有'isNaN()'函數是有道理的。人們可以把'x!== x'放在整個地方,但是可能不太清楚,只是看看它的用途是什麼,因此在使用中會帶來更大的混淆和錯誤風險。 isNaN()'很清晰。 – 2014-10-17 17:24:17

相關問題