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

IT技术 javascript null undefined
2021-01-10 20:32:28
  1. 如何检查一个变量,如果是nullundefined,是什么之间的差异nullundefined

  2. =====(很难在 Google 上搜索“===”)有什么区别

6个回答

我如何检查一个变量,如果它是nullundefined...

是变量null

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

...但请注意,如果ais ,后者也将成立undefined

是吗undefined

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

...但同样,请注意最后一个是模糊的;如果a是,它也将是真的null

现在,尽管有上述情况, 检查这些通常方法是使用它们是false的事实

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是Null 类型undefined的唯一值,也是Undefined 类型的唯一值。

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

它们之间的唯一区别是==会进行类型强制以尝试使值匹配,而===不会。所以例如"1" == 1是真的,因为"1"强制到1. "1" === 1false,因为类型不匹配。"1" !== 1是真的。)第一个(真正的)步骤===是“操作数的类型是否相同?” 如果答案为“否”,则结果为false如果类型相同,则它的作用完全相同==

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

规范中的更多内容:

为了提炼 TJ 的答案,=== 表示值和类型相同。
2021-03-11 20:32:28
如果if (a == null)a is 则返回 true undefined,因此仅a == null当我想检查 a 是null时才检查是否安全undefined
2021-03-15 20:32:28
我不得不同意克罗克福德是错误的。typeof null返回“对象”是有道理的。唯一有意义的其他值是“null”,因为它肯定应该返回与typeof undefined. null 代表一个空对象引用,这至少意味着持有它的变量是针对某种类型的“对象”。如果这是一个错误,那是一个很好的错误。无论如何,关于答案,关于跨窗口脚本期间undefined!==的提示undefined很高兴知道,特别是对于调试目的。
2021-03-26 20:32:28
@Slappy: :-) @MUG4N:是的,没错。if (a) { ... }将意味着“如果a是真的”,其中“真”是一个非零、非空、非未定义、非假、非空字符串值。:-)
2021-03-31 20:32:28
@Željko:我认为 Crockford 在这一点上可能是错误的。确实,这null不是一个对象,而是一个对象引用,意思是“没有对象”。这很重要,因为当主机提供的接口提供对象引用但没有提供对象引用node.nextSibling(例如,何时node是其父级中的最后一个元素,或者getElementById当没有具有该 ID 的元素时),它会与主机提供的接口一起使用。主机为此使用的技术可能不像 JavaScript 那样灵活,因为它是关于变量/属性类型的,因此有必要有一个nullobj ref(而不是undefined)。
2021-04-03 20:32:28

区别很微妙。

在 JavaScript 中,undefined变量是从未被声明或从未赋值的变量。var a;例如,假设您声明了,然后a将是undefined,因为它从未被分配任何值。

但是,如果您然后分配a = null;那么a现在将是null. 在 JavaScript 中null是一个对象(typeof null如果您不相信我,请在 JavaScript 控制台中尝试),这意味着 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) thenoptional 将是"three"字符串,但如果您通过,doSomething(1, 2, null)则可选将是null.

至于相等==和严格相等===比较器,第一个是弱类型,而严格相等也检查值的类型。这意味着0 == "0"将返回 true;while0 === "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
凯尔辛普森声称 typeof null 返回“对象”是一个错误:github.com/getify/You-Dont-Know-JS/blob/master/...
2021-03-24 20:32:28

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

  1. 对于变量x,您可以:

    • 检查是否null通过直接比较使用===. 例子:x === null
    • 检查它是否是undefined通过两种基本方法之一:与undefined直接比较typeof由于种种原因,我更喜欢typeof x === "undefined"
    • 检查它是否是一个nullundefined利用==和依托略有神秘的强制类型转换规则,意味着x == null你想要做什么。

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

更多阅读:

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

只需检查变量是否具有这样的有效值:

if(variable)

如果变量不包含,它将返回真:

  • 空值
  • 不明确的
  • 0
  • 错误的
  • ""(空字符串)
  • NaN

不明确的

这意味着变量尚未初始化。

例子 :

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

等于(==)

它只检查 value 是否等于而不是 datatype 。

例子 :

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

因为它只检查 value 。

严格等于(===)

检查值和数据类型是否应该相同。

例子 :

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

因为它检查数据类型 x 是原始类型而 y 是布尔对象。