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

我知道,我知道必须有一些涵盖这个主题的主题。 但我使用了搜索功能,没有得到符合我需求的答案。 所以我们走吧:

  • 如何检查变量是否为nullundefined以及nullundefined之间的区别是什么?

  • “==”和“===”有什么区别(很难搜索谷歌=== )?


  • 如何检查变量是否为nullundefined ...

    变量为null

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

    ......但请注意,如果a undefined ,后者也将是真实的。

    undefined

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

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

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

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

    这由规范中的ToBoolean定义。

    ...和nullundefined之间的区别是什么?

    它们都是通常用来表示没有东西的值。 undefined是更通用的变量,它被用作变量的默认值,直到它们被赋予其他值,作为调用该函数时未提供的函数参数的值,以及当您询问时得到的值它不具有的属性的对象。 但它也可以明确地用于所有这些情况。 (没有属性的对象与属性的值undefined是有区别的;调用一个函数时,参数undefined的值与完全关闭该参数是有区别的。)

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

    有趣的是(或不),他们是他们自己的类型。 也就是说, null是Null类型中唯一的值, undefined是Undefined类型中的唯一值。

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

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

    类型强制使用相当复杂的规则,并可能有令人惊讶的结果(例如, "" == 0是真实的)。

    更多规格:

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

  • 差别是微妙的。

    在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
    

    该规范是完整回答这些问题的地方。 以下是一个总结:

  • 对于变量x ,您可以:

  • 通过使用===直接比较来检查它是否为null 。 例如: x === null
  • 检查它是否由两个基本方法中的任何一个undefined :直接与undefinedtypeof进行比较。 由于各种原因,我更喜欢typeof x === "undefined"
  • 通过使用==检查它是否为nullundefined之一,并依赖于意味着x == null的略微神秘类型的强制规则完全符合你的要求。

  • =====之间的基本区别是,如果操作数的类型不同, ===将始终返回false==会使用导致一些稍微不直观的行为的规则将一个或两个操作数转换为相同类型。 如果操作数是相同类型的(例如,二者都是字符串,如在typeof上述比较), =====的行为完全是相同的。
  • 更多阅读:

  • Angus Croll的真相,平等和JavaScript
  • Andrea Giammarchi的JavaScript强制揭秘
  • comp.lang.javascript常见问题解答:JavaScript类型转换
  • 链接地址: http://www.djcxy.com/p/13367.html

    上一篇: JavaScript checking for null vs. undefined and difference between == and ===

    下一篇: Why is there a `null` value in JavaScript?