JavaScript检查null与undefined以及==和===之间的区别

我知道,我知道这个话题必须有一些线索。 但是我使用了search,没有得到符合我需要的答案。 所以在这里我们去:

  1. 如何检查一个variables,如果它是nullundefinednullundefined之间有什么区别?

  2. “==”和“===”之间的区别是什么(很难search谷歌=== )?

如何检查variables是否为nullundefined

是variablesnull

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

…但是请注意,如果aundefined ,后者也将是真实的。

undefined

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

…但是请注意,最后一个是模糊的; 如果anull也是如此。

现在,尽pipe如此, 通常的方法来检查这些是使用事实,他们是假的

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

这是由规范中的ToBoolean定义的。

…什么是nullundefined之间的区别?

它们都是通常用来表示没有东西的值。 undefined是更通用的一个,用作variables的默认值,直到它们被赋予其他值,作为调用该函数时未提供的函数参数的值,以及当您询问时得到的值对象的属性它没有。 但也可以在所有这些情况下明确使用。 (没有属性的对象与undefined的属性之间是有区别的;调用一个函数与undefined的参数值并将该参数完全closures是有区别的。

nullundefined更具体:它是一个空白的对象引用。 当然,JavaScript是松散types的,但并不是所有与JavaScript交互的东西都是松散types的。 如果像浏览器中的DOM这样的API需要空白的对象引用,那么我们使用null ,而不是undefined 。 类似地,DOM的getElementById操作返回一个对象引用 – 一个有效的引用(如果它find了DOM元素),或者返回null (如果没有)。

有趣(或不),他们是他们自己的types。 也就是说, null是Nulltypes中唯一的值, undefined是Undefinedtypes中唯一的值。

“==”和“===”有什么区别

它们之间的唯一区别是, ==会执行types强制来获得匹配的值,而===不会。 因此,例如"1" == 1是真实的,因为"1"强制为1 。 但是"1" === 1错误的 ,因为types不匹配。 ( "1" !== 1是真的。) ===的第一个(真实)步骤是“操作数的types是否相同? 如果答案是“否”,结果是false 。 如果types是相同的,它确实是做什么==

types强制使用相当复杂的规则,可能会有令人惊讶的结果(例如, "" == 0为真”)。

更多的规格:

  • 抽象平等比较 ( == ,也被称为“宽松”平等)
  • 严格的平等比较 ( ===

差别是微妙的。

在JavaScript中,一个undefinedvariables是一个从未被声明的variables,或者从未被赋值的variables。 假设你声明var a; 例如,那么a将是undefined ,因为它从来没有分配任何价值。

但是,如果你然后分配a = null; 那么现在将是null 。 在JavaScript中, null是一个对象(如果你不相信我,请在JavaScript控制台中尝试typeof null ),这意味着null是一个值(实际上甚至是undefined的值)。

例:

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

这可以在函数参数中certificate有用。 您可能希望有一个默认值,但认为null是可以接受的。 在这种情况下你可以这样做:

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

如果您省略了optional参数doSomething(1, 2) then选项将是"three"string,但是如果您传递doSomething(1, 2, null)则可选项将为null

至于=====严格等于比较,第一个是弱types,严格相等也检查值的types。 这意味着0 == "0"将返回true; 而0 === "0"将返回false,因为一个数字不是一个string。

您可以使用这些运算符来检查undefinednull 。 例如:

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

最后一种情况很有趣,因为它允许你检查一个variables是未定义的还是空的,

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

规范是这些问题的完整答案的地方。 这里有一个总结:

  1. 对于variablesx ,您可以:
    • ===直接比较是否为null 。 例如: x === null
    • 检查它是否由两个基本方法中的任何一个undefined :直接与undefinedtypeof进行比较。 由于种种原因 ,我更喜欢typeof x === "undefined"
    • 通过使用==检查它是否是nullundefined之一,并且依靠那些意味着x == null的略微神秘的types的强制规则完全是你想要的。
  2. =====之间的基本区别是,如果操作数是不同的types, ===将始终返回false==会使用导致一些稍微不直观的行为的规则将一个或两个操作数转换为相同types。 如果操作数是相同的types(例如,两者都是string,比如上面的types比较), =====行为将完全相同。

更多阅读:

  • 安格斯克罗尔的真相,平等和JavaScript
  • Andrea Giammarchi的JavaScript强制揭秘
  • comp.lang.javascript常见问题: JavaScripttypes转换

未定义

这意味着variables还没有初始化。

例如:

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

等于(==)

它只检查值是等于不是数据types。

例如:

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

因为它只检查价值。

严格等于(===)

检查值和数据types应该是相同的。

例如:

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

因为它检查数据typesx是一个基本types,y是一个布尔对象。

如果你的(逻辑)检查是一个否定(!),并且你想要捕获JS null'Undefined' (因为不同的浏览器会给你不同的结果),你可以使用较less限制的比较:例如:

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

这将捕获null'Undefined'

如何检查variables是否为空或未定义

只要检查一个variables是否有这样的有效值:

 if(variable) 

它将返回true如果variables不包含:

  • 空值
  • 未定义
  • 0
  • “”(一个空string)
  • 为NaN

如果你想检查nullundefined但不依赖于单纯的错误,你也可以使用这个可重复使用的is-nil组件来确定val引用是否为null或undefined。

例子:

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

例如,对于一个空string,它将返回false。