【问题标题】:JavaScript checking for null vs. undefined and difference between == and ===JavaScript 检查 null 与未定义以及 == 和 === 之间的区别
【发布时间】:2011-07-03 09:12:23
【问题描述】:
  1. 如果变量是nullundefined,我如何检查它,nullundefined 之间有什么区别?

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

【问题讨论】:

  • 2. ===== 之间的区别很好 described here
  • 1.使用 === 代替 == JavaScript 使用两种不同的相等运算符: === | !== 和 == | != 在比较时始终使用前一组被认为是最佳实践。 “如果两个操作数的类型和值相同,则 === 产生真,!== 产生假。” - JavaScript:好的部分 然而,当使用 == 和 != 时,你会在使用不同的类型时遇到问题。在这些情况下,他们会尝试强制这些值,但没有成功。 code.tutsplus.com/tutorials/…
  • 您可以在 Google 上搜索:“严格相等运算符” - 获取非常相关的结果
  • 只是在这里添加许多答案,您可以使用lodash.com/docs#isNil 函数来检查变量是否为空或未定义

标签: javascript null undefined


【解决方案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 也是如此。

现在,尽管有上述情况,检查这些的通常方法是使用它们是 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 的函数作为参数和完全关闭该参数之间存在差异。)

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 为真)。

规范中的更多内容:

【讨论】:

  • 提炼 TJ 的答案,=== 表示值和类型相同。
  • @Slappy: :-) @MUG4N:是的,没错。 if (a) { ... } 将意味着“如果 a 是真实的”,其中“真实”是一个非零、非空、非未定义、非假、非空字符串值。 :-)
  • @Željko:我认为 Crockford 在这一点上可能是错误的。 null 确实不是一个对象,它是一个对象引用,意思是“没有对象”。这很重要,因为当主机提供的接口提供对象引用但没有提供对象引用时,它就是使用的接口(例如,node.nextSiblingnode 是其父元素中的最后一个元素,或者getElementById 当有没有具有该 ID 的元素)。主机为此使用的技术可能不像 JavaScript 那样灵活,是关于变量/属性类型的,因此必须有一个 null obj ref(而不是 undefined)。
  • 我不得不承认 Crockford 是错误的。 typeof null 返回“对象”是有道理的。唯一有意义的其他值是“null”,因为它肯定应该返回与typeof undefined 不同的东西。 null 表示一个空对象引用,这至少意味着持有它的变量是用于某种类型的“对象”。如果这是一个错误,那是一个很好的错误。无论如何,关于答案,关于跨窗口脚本编写期间undefined !== undefined 的提示很高兴知道,尤其是出于调试目的。
  • 如果 if (a == null) 在 a 是 undefined 时返回 true,那么如果我想检查 a 是 null 还是 undefined,那么只检查 a == null 是否安全?
【解决方案2】:

区别很微妙。

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

【讨论】:

【解决方案3】:

The spec 是获得这些问题完整答案的地方。总结如下:

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

    • 使用===直接比较,检查是否为null。示例:x === null
    • 判断是否为undefined,有两种基本方法:直接比较undefinedtypeof。对于various reasons,我更喜欢typeof x === "undefined"
    • 检查它是否是nullundefined 之一,方法是使用== 并依靠稍微神秘的类型强制规则,这意味着x == null 完全符合您的要求。

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

更多阅读:

【讨论】:

    【解决方案4】:

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

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

    if(variable)
    

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

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

    【讨论】:

      【解决方案5】:

      未定义

      表示变量尚未初始化。

      例子:

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

      【讨论】:

        【解决方案6】:

        广告 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):

        如果

        ==(它的否定!=

        ===(它的否定!==

        【讨论】:

        • 值得一提的是document.all == nulldocument.all !== null
        • ?false == [0]"1" == true
        【解决方案7】:

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

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

        这将捕获nullundefined

        【讨论】:

          【解决方案8】:

          尝试不同的逻辑。您可以使用波纹管代码检查所有四 (4) 个条件以进行验证,例如非空、非空白、非未定义和非零仅在 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);
          }
          

          }

          【讨论】:

            猜你喜欢
            • 2011-03-26
            • 2011-06-12
            • 2012-07-28
            • 1970-01-01
            • 2023-03-15
            • 1970-01-01
            • 1970-01-01
            • 2021-04-19
            • 2013-01-12
            相关资源
            最近更新 更多