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

时间:2011-02-24 08:10:55

标签: javascript null undefined

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

  1. 如果变量nullundefined以及nullundefined之间有什么区别?

  2. =====之间有什么区别(谷歌搜索“===”很难)?

8 个答案:

答案 0 :(得分:870)

  

如果变量是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,则也是如此。

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

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

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

规范中的更多内容:

答案 1 :(得分:88)

差异很微妙。

在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,因为数字不是字符串。

您可以使用这些运算符在undefined null之间进行检查。例如:

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

答案 2 :(得分:15)

The spec是获得这些问题的完整答案的地方。以下是摘要:

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

    • 使用null通过直接比较检查是===。示例:x === null
    • 使用以下两种基本方法之一检查undefined是否为undefined:与typeoftypeof x === "undefined"进行直接比较。对于various reasons,我更喜欢null
    • 使用undefined检查是==x == null中的一个,并依赖于稍微晦涩的类型强制规则,这意味着==完全符合您的要求。

  2. ======之间的基本区别在于,如果操作数的类型不同,false将始终返回==typeof将转换为==或者使用rules将两个操作数转换为相同的类型,这会导致一些稍微不直观的行为。如果操作数具有相同的类型(例如,两者都是字符串,例如在上面的===比较中),则{{1}}和{{1}}的行为将完全相同。
  3. 更多阅读:

答案 3 :(得分: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 :(得分:4)

How do I check a variable if it's null or undefined

just check if a variable has a valid value like this :

if(variable)

it will return true if variable does't contain :

  • null
  • undefined
  • 0
  • false
  • "" (an empty string)
  • NaN

答案 5 :(得分:1)

如果您的(逻辑)检查是否为否定(!)并且您想同时捕获JS nullundefined(因为不同的浏览器会给您不同的结果),您将使用限制较少的比较: e.g:

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

这将捕获nullundefined

答案 6 :(得分:0)

您可以使用下面的代码检查所有四(4)个条件以进行验证,例如不为null,不为空,不是未定义以及不为零,仅在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);
}

}

答案 7 :(得分:0)

广告1。null不是全局对象属性的标识符,例如undefined can be

let x;      // undefined
let y=null; // null
let z=3;    // has value
// 'w'      // is undeclared

if(!x) console.log('x is null or undefined');
if(!y) console.log('y is null or undefined');
if(!z) console.log('z is null or undefined');

try { if(w) 0 } catch(e) { console.log('w is undeclared') }
// typeof not throw exception for undelared variabels
if(typeof w === 'undefined') console.log('w is undefined');

广告2。===检查值和类型。 ==不需要相同的类型,并且在比较之前进行了隐式转换(使用.valueOf().toString())。这里有全部(src):

如果

enter image description here

== (否定!=

enter image description here

=== (否定!==

enter image description here