JavaScript 检查 null 与 unfined 以及 == 和 === 之间的差异

2022-08-29 22:42:00
  1. 如何检查变量(如果它是 or)和 和 之间的区别是什么?nullundefinednullundefined

  2. 和(很难在谷歌上搜索“===”)有什么区别?=====


答案 1

如何检查变量,如果它是或...nullundefined

是变量 :null

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

现在,尽管有上述内容,但检查这些内容的常用方法是使用它们是虚假的事实

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

这由规范中的 ToBoolean 定义。

...和 之间有什么区别?nullundefined

它们都是通常用于指示缺少某些内容的值。 是更通用的一个,用作变量的默认值,直到它们被分配了其他值,作为调用函数时未提供的函数参数的值,以及当您向对象请求它没有的属性时获得的值。但它也可以在所有这些情况下明确使用。(没有属性的对象和具有值的属性之间是有区别的;调用具有参数值的函数和完全关闭该参数之间是有区别的。undefinedundefinedundefined

null比 :它是一个空白对象引用。当然,JavaScript是松散类型的,但并非所有与JavaScript交互的东西都是松散类型的。如果像浏览器中的 DOM 这样的 API 需要一个空白的对象引用,我们使用 ,而不是 。同样,DOM 的操作返回一个对象引用 — 要么是有效的(如果它找到了 DOM 元素),要么(如果它没有找到)。undefinednullundefinedgetElementByIdnull

有趣的是(或不是),他们是自己的类型。也就是说,它是 Null 类型中的唯一值,并且是未定义类型中的唯一值。nullundefined

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

它们之间的唯一区别是,将执行类型强制以尝试使值匹配,并且不会。因此,例如,这是真的,因为强制到.但是是错误的,因为类型不匹配。(确实如此。第一个(实际的)步骤是“操作数的类型是否相同?”如果答案为“否”,则结果为 。如果类型相同,则它执行完全相同的操作。====="1" == 1"1"1"1" === 1"1" !== 1===false==

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

规格中的更多内容:


答案 2

区别是微妙的。

在 JavaScript 中,变量是从未声明或从未赋值的变量。假设您声明例如,那么将是 ,因为它从未被分配过任何值。undefinedvar a;aundefined

但是,如果您随后分配,则现在将是 .在JavaScript中是一个对象(如果你不相信我,请在JavaScript控制台中尝试),这意味着null是一个值(实际上甚至是一个值)。a = null;anullnulltypeof nullundefined

例:

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 将是字符串,但如果传递,则 optional 将是 。optionaldoSomething(1, 2) then"three"doSomething(1, 2, null)null

至于相等和严格相等的比较器,第一个是弱类型,而严格相等也检查值的类型。这意味着这将返回真实;while 将返回 false,因为数字不是字符串。=====0 == "0"0 === "0"

您可以使用这些运算符在 .例如: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