2011-02-24 58 views
450

我知道,我知道必須有一些線程覆蓋此主題。但我使用了搜索功能,沒有得到符合我需求的答案。所以在這裏,我們去:JavaScript檢查null與undefined以及==和===之間的區別

  1. 如何檢查一個變量,如果它是nullundefined是什麼nullundefined之間的區別?

  2. 「==」和「===」之間的區別是什麼(難以搜索Google的===)?

+8

2之間的差'=='和''===是公[此處描述] (http://jquery-howto.blogspot.com/2012/11/jquery-double-tripple-equal-difference.html)。 – Uzbekjon 2013-02-14 09:37:55

+0

1.使用===而不是== JavaScript使用兩種不同類型的相等運算符:=== | !==和== | !=在比較時始終使用前一組被認爲是最佳做法。 「如果兩個操作數具有相同的類型和值,則===會生成true,並且!==會生成false。」 - JavaScript:好的部分 但是,使用==和!=時,在使用不同類型時會遇到問題。在這些情況下,他們會試圖強制價值觀,但不成功。 HTTP://code.tutsplus。com/tutorials/24-javascript-best-practices-for-beginners -net-5399 – jasonleonhard 2014-12-19 20:23:41

+3

您可以搜索Google:「嚴格平等運營商」 - 獲取非常相關的結果 – Danield 2015-11-17 10:41:15

回答

746

如何檢查一個變量,如果它是nullundefined ...

是變量null

if (a === null) 
// or 
if (a == null) // but see note below 

...但要注意後者也將如果aundefined,則爲true。

是否undefined

if (typeof a === "undefined") 
// or 
if (a === undefined) 
// or 
if (a == undefined) // but see note below 

...但再次,注意,最後一個是模糊的;如果anull也是如此。

現在,儘管上述情況,以檢查那些通常的方法是使用一個事實,即他們是falsey

if (!a) { 
    // `a` is falsey, which includes `undefined` and `null` 
    // (and `""`, and `0`, and `NaN`, and [of course] `false`) 
} 

這是由ToBoolean在規範中定義。

...和nullundefined之間有什麼區別?

它們都是通常用於表示缺少某些東西的值。 undefined是更通用的函數,用作變量的默認值,直到它們被賦予其他值,作爲函數調用時未提供的函數參數的值,以及當您詢問函數時獲得的值它不具有的屬性的對象。但它也可以明確地用於所有這些情況。 (有不具有對象的屬性,並與值undefined具有屬性之間的差;有主叫與值undefined一個函數的參數,並且在離開該參數完全關閉之間的差。)

null是略高於undefined:這是一個空白對象參考。當然,JavaScript是鬆散類型的,但並不是所有與JavaScript交互的東西都是鬆散類型的。如果像瀏覽器中的DOM這樣的API需要空白的對象引用,我們使用null而不是undefined。同樣,DOM的getElementById操作返回對象引用  —或者是有效的(如果它找到了DOM元素)或null(如果沒有)。

有趣(或不),他們是他們自己的類型。也就是說,null是空類型中唯一的值,而undefined是未定義類型中的唯一值。

是什麼「==」和「===」之間的區別

他們之間的唯一區別是,==將做強制類型轉換,試圖獲取值匹配,並===慣於。因此,例如"1" == 1爲真,因爲"1"強制爲1。但"1" === 1虛假,因爲類型不匹配。 ("1" !== 1爲真。)===的第一個(實際)步驟是「操作數的類型是否相同?」如果答案是「否」,則結果爲false。如果類型相同,則它確實是==所做的。

類型強制使用相當複雜的規則,並可能有令人驚訝的結果(例如,"" == 0是真實的)。

更多在spec:

+98

要提煉TJ的答案,===表示值AND類型相同。 – Slappy 2011-02-24 08:48:16

+0

我可以使用其他方式: 如果(a){}這意味着不是null或未定義的權利? – MUG4N 2011-02-24 09:16:42

+9

@Slappy :-) @ MUG4N:是的,沒錯。如果(a){...}意味着「如果a是真的」,其中「truthy」是一個非零的,非空的,非未定義的,非假的非空字符串值。 :-) – 2011-02-24 10:10:30

82

的差異是微妙的。

在JavaScript中,undefined變量是一個從未聲明或從未分配過值的變量。假設您例如宣佈var a;,那麼a將爲undefined,因爲它從未被分配任何值。

但是,如果您然後分配a = null;那麼a現在將是null。在JavaScript中,null是一個對象(如果您不相信我,請在JavaScript控制檯中嘗試typeof null),這意味着null是一個值(實際上即使undefined是一個值)。

實施例:

var a; 
typeof a;  # => "undefined" 

a = null; 
typeof null; # => "object" 

這可以證明在函數參數是有用的。你可能想要一個默認值,但是認爲null是可以接受的。在這種情況下,你可以這樣做:

function doSomething(first, second, optional) { 
    if (typeof optional === "undefined") { 
     optional = "three"; 
    } 
    // do something 
} 

如果省略optional參數doSomething(1, 2) then可選的將是"three"字符串,但如果你通過doSomething(1, 2, null)然後任選將null

至於等於==和嚴格等於===比較,第一個是弱類型,而嚴格等於也檢查值的類型。這意味着0 == "0"將返回true;而0 === "0"將返回false,因爲一個數字不是一個字符串。

您可以使用這些運營商undefinednull之間進行檢查。例如:

null === null   # => true 
undefined === undefined # => true 
undefined === null  # => false 
undefined == null  # => true 

最後一種情況是有趣的,因爲它可以讓你檢查,如果一個變量或者是未定義或爲空,沒有別的:

function test(val) { 
    return val == null; 
} 
test(null);  # => true 
test(undefined); # => true 
+1

很好的解釋! – 2015-09-01 09:07:27

+1

Kyle Simpson聲稱typeof null返回「object」是一個錯誤:https://github.com/getify/You-Dont-Know-JS/blob/master/up%20&%20going/ch2.md#values--types – Berzerk 2015-12-14 15:53:36

7

不確定

這意味着該變量尚未初始化。

實施例:

var x; 
if(x){ //you can check like this 
    //code. 
} 

等於(==)

它只檢查值是等於不數據類型。

實施例:

var x = true; 
var y = new Boolean(true); 
x == y ; //returns true 

因爲它檢查只值。

嚴格等於(===)

檢查值和數據類型應該是相同的。

實施例:

var x = true; 
var y = new Boolean(true); 
x===y; //returns false. 

因爲它檢查數據類型x是原始類型,y是一個布爾對象。

12

The spec是去充分回答這些問題的地方。這裏有一個總結:

  1. 對於可變x,您可以:它

    • 檢查是否使用===直接比較的null。示例:x === null
    • 通過兩種基本方法之一檢查是否爲undefined:與undefinedtypeof直接比較。對於various reasons,我更喜歡typeof x === "undefined"
    • 使用==來檢查它是否爲nullundefined之一,並依靠略微的奧術類型強制規則,這意味着x == null完全符合您的要求。

  2. =====之間的基本區別是,如果操作數是不同類型的,===總是返回false==就會將一個或兩個操作數爲相同類型的使用rules導致一些輕微不直觀的行爲。如果操作數是相同類型的(例如,都是字符串,比如上面的typeof比較),=====的行爲將完全相同。

更多閱讀:

0

如果你的(邏輯)檢查是一個否定(!),並且要同時捕獲JS null'Undefined'(爲不同的瀏覽器會給你不同的結果),你可以使用限制較少的比較: 如:

var ItemID = Item.get_id(); 
if (ItemID != null) 
{ 
//do stuff 
} 

這將捕獲兩個null'Undefined'

-2

如果你想檢查nullundefined但不依賴於單純的錯誤,您也可以使用此reusable is-nil component決定val引用爲空還是未定義。

例子:

isNil(null) // => true 
isNil('') // => true 

空字符串,例如,它會返回false。

0

如何檢查一個變量,如果它是null或undefined

只是檢查,如果一個變量有這樣一個有效值:

if(variable) 

如果變量不,它會返回true t包含:

  • null
  • 未定義
  • 「」(空字符串)
  • 的NaN
相關問題