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


579
  1. 如何检查一个变量,如果是nullundefined,是什么之间的差异nullundefined

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


10
2.之间的差异=====很好这里描述
2013年

1.使用===代替== JavaScript使用两种不同的相等运算符:=== | !==和== | !=比较时始终使用前一组是最佳实践。“如果两个操作数具有相同的类型和值,则===生成true,而!==生成false。” -JavaScript:主要部分但是,使用==和!=时,使用不同类型时会遇到问题。在这些情况下,他们将尝试强制更改值,但不会成功。code.tutsplus.com/tutorials/...
jasonleonhard

4
您可以在Google上搜索:“严格相等运算符”-获取非常相关的结果
Danield

只需在此处添加许多答案即可,您可以使用lodash.com/docs#isNil函数检查变量是否为null或未定义
Kfir Erez

Answers:


936

如何检查一个变量,如果它null还是undefined...

是变量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

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

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" === 1false,因为类型不匹配。("1" !== 1是。)的第一步(实际)===是“操作数的类型是否相同?” 如果答案为“否”,则结果为false。如果类型相同,那么它将完全==一样。

类型强制使用非常复杂的规则,并且可能产生令人惊讶的结果(例如,"" == 0是正确的)。

规格中的更多内容:


122
要提取TJ的答案,===表示值和类型相同。
Slappy

13
@Slappy::-) @ MUG4N:是的,没错。if (a) { ... }表示“如果a是真实的”,其中“真实的”是非零,非空,非不确定,非假,非空字符串值。:-)
TJ Crowder

4
嗯...下降投票者是否愿意分享一些有用的反馈,以了解为什么您认为这没有用(引用下降投票按钮的工具提示)?
TJ Crowder

2
@Željko:我认为克罗克福德在这一点上可能是错误的。的确,这null不是对象,而是对象引用,表示“无对象”。这很重要,因为当主机提供的接口提供对象引用但没有提供对象引用node.nextSibling时(例如,何时node是其父元素中的最后一个元素,或者getElementById没有该ID的元素),这就是主机提供的接口所使用的接口。主机用于此目的的技术可能不像JavaScript关于变量/属性类型那样灵活,因此有必要提供nullobj ref(与相对undefined)。
TJ Crowder

2
我必须同意克罗克福德是错误的。typeof null返回“对象”是有意义的。唯一有意义的其他值为“ null”,因为它肯定会返回不同于的值typeof undefined。null表示一个空对象引用,至少,这意味着保存它的变量是针对某种“对象”的。如果这是一个错误,那是一个很好的错误。无论如何,关于答案,跨窗口脚本编写过程中有关undefined!== 的技巧undefined是众所周知的,尤其是用于调试目的。
Triynko 2014年

93

区别是微妙的。

在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)则optional将是字符串null

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

您可以使用这些运营商之间要检查undefinednull。例如:

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

最后一种情况很有趣,因为它允许您检查变量是未定义的还是null,而没有别的:

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

1
凯尔·辛普森(Kyle Simpson)声称返回“对象”的typeof null是一个错误:github.com/getify/You-Dont-Know-JS/blob/master/…–
bzrk

15

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

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

    • null通过使用进行直接比较来检查是否===。例:x === null
    • undefined通过以下两种基本方法之一检查它:与undefined或直接比较typeof。由于种种原因,我更喜欢typeof x === "undefined"
    • 检查它是否是其中之一,nullundefined通过使用==和依靠略为神秘的强制类型来强制x == null执行您想要的操作。

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

更多阅读:


9

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

只需检查变量是否具有如下有效值:

if(variable)

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

  • 空值
  • 未定义
  • 0
  • “”(空字符串)
  • N

8

未定义

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

范例:

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是布尔对象。


4

广告1. null不是全局对象的属性的标识符,像undefined

广告2. ===检查值和类型。的==不要需要相同类型和由隐式转换比较之前(使用.valueOf().toString())。这是全部(src):

如果

在此处输入图片说明

==(其否定!=

在此处输入图片说明

===(其否定!==

在此处输入图片说明


1
这是值得一提的是document.all == nulldocument.all !== null
用户

1

如果(逻辑)检查是否为负号(!),并且您希望同时捕获JS nullundefined (由于不同的浏览器将为您提供不同的结果),则可以使用限制性较小的比较:例如:

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

这将同时捕获nullundefined


0

尝试不同的逻辑。您可以使用下面的代码检查所有四(4)条条件以进行验证,例如not null,not blank,not undefined和not zero,仅在javascript和jquery中使用此代码(!(!(variable)))。

function myFunction() {
var data;  //The Values can be like as null, blank, undefined, zero you can test

if(!(!(data)))
{
   //If data has valid value
    alert("data "+data);
} 
else 
{
    //If data has null, blank, undefined, zero etc.
    alert("data is "+data);
}

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.