【问题标题】:difference between null and undefined in JavaScript?JavaScript 中 null 和 undefined 的区别?
【发布时间】:2023-03-18 00:30:01
【问题描述】:

根据What is the difference between null and undefined in JavaScript?nullundefined 在 Javascript 中是两个不同的对象(具有不同的类型)。但是当我尝试这段代码时

var a=null;
var b;
alert(a==null);      // expecting true
alert(a==undefined); // expecting false
alert(b==null);      // expecting false
alert(b==undefined); // expecting true

以上代码的输出为:

true
true
true 
true

现在== 只匹配值,我认为undefinednull 必须具有相同的值。所以我尝试了:

alert(null) -> 给null

alert(undefined) -> 给undefined

我不明白这怎么可能。

这里是the demo

编辑

我知道=== 会给出预期的结果,因为undefinednull 具有不同的类型,但是在== 的情况下,JavaScript 中的类型转换如何工作?我们可以像在 Java 中那样进行显式类型转换吗?我想对undefinednull 应用手动类型转换。

【问题讨论】:

  • 你想用什么方式转换它们?两者都为空?
  • 你要么未定义为对象(空类型)或nullundefined
  • myVal = myVal == null ? null : myVal; 应该可以解决问题。现在它绝对不是未定义的。
  • @JonHanna 我期待一些更像 (typeof(undefined))(null) 的东西,上面更像是基于 null==undefined 的谓词的 if 和 else
  • 就是这样。不,这不好。

标签: javascript


【解决方案1】:

您需要使用identity operator ===, not the equality operator ==。通过此更改,您的 code works as expected:

alert(a===null);      // true
alert(a===undefined); // false
alert(b===null);      // false
alert(b===undefined); // true

在这种情况下,相等运算符失败的原因是它试图进行类型转换。 undefinedundefined 类型,nullobject 类型;在尝试比较两者时,Javascript 将两者都转换为false,这就是为什么最终认为它们相等的原因。另一方面,恒等运算符不进行类型转换,需要类型相等才能得出相等。

编辑 感谢@user1600680 指出,以上不完全正确; ECMAScript 规范将 null-to-undefined 定义为特殊情况,并且相等。没有到false 的中间转换。


一个更简单的类型转换示例是数字到字符串:
console.log(5 == "5");    // true
console.log(5 === "5");   // false

上面的答案很好地引用了 Douglas Crockford 的 Javascript: The Good Parts

[“==”运算符在操作数属于相同类型时是正确的,但如果它们属于不同类型,它们会尝试强制转换值。他们这样做的规则既复杂又难以忘怀。

如果您不相信这些规则复杂且难以记忆,请联系quick look at those rules 会让你打消这个念头。

【讨论】:

  • 虽然我同意您的回答基本上是有效的,但解释为什么在 Javascript 中表现出这种行为可能不会有什么坏处;)
  • 链接页面总结的“复杂且难以记住”的规则(ECMA 262 中的确切规则再次变得更糟)是当您以“让我们做吧简单,做显而易见的事情”。简单,也可以很复杂。
  • 这个答案不对。 nullundefined 值不会转换为 false。对于这些值,== 转换规则非常简单nullundefined 值将不等于 nullundefined。无需进一步转换。
  • 正如我所说,nullundefined 将不等于 nullundefined。如null 等于nullnull 等于undefinedundefined 等于nullundefined 等于undefined。但nullundefined 等于[any other value] 将是错误的。
  • es5.github.com/#x11.9.3 2. If x is null and y is undefined, return true. 3. If x is undefined and y is null, return true. 没有其他强制发生。 == 通常不会转换为布尔值。它有一个特定的算法,通常会转换为数字。
【解决方案2】:

undefinednull 的语义非常不同。

undefined 通常表示“没有任何回复”,null 表示“有回复但没有回复。”

例如,如果我创建了这个对象:

var gameState = {
  state: loaded,
  lastPlayer: null,
  lastScore: null
};

这并不意味着“我不知道最后一个玩家是谁”,而是“没有最后一个玩家”。

【讨论】:

  • 我理解这一点,但本质上我的问题是当使用== 用于nullundefined 时应用了哪种类型的算法,它们是如何比较的?什么是类型转换,那个类型转换返回什么?
  • 感谢链接,已清除所有内容,已添加到 ans stackoverflow.com/a/12218504/662250
【解决方案3】:

为了澄清之前的答案,== 之所以这样工作,是因为与=== 不同,它确实是type conversion

【讨论】:

    【解决方案4】:
     var a;
     var b = null;
    

    a 未定义,b 完全为空。

    == 用于以故意松散的方式比较相等性,这通常很有用

    alert("3" == 3.0);
    

    这给了我们true,尽管它们明显不同——一个是数字,一个是字符串。

    虽然很多时候,这很棒。

    同样,很多时候并不关心某些东西是否没有真正的价值,因为它是未定义的,或者是因为它被显式设置为 null。

    虽然有时很有用,但我们有时也需要知道确切的类型匹配以及值,所以我们也有===

    【讨论】:

      【解决方案5】:

      我还想说undefinedtypeof 一起使用。 比较必须为:

      if( typeof(b)=="undefined" ){}
      

      结果与

      相同
      if( b === undefined ){}
      

      我已经在你的代码http://jsfiddle.net/A89Qj/5/ 中包含了这个额外的测试

      【讨论】:

        【解决方案6】:

        您需要使用 === 而不是 ==。 === 运算符的行为方式与 == 运算符相同,只是它不进行任何类型转换。

        【讨论】:

          【解决方案7】:

          typeof undefined 是 undefined 但 null 的类型是 object。 null === undefined 会给你错误的。 但是 null == undefined 会给你真实的。 因为 boh 具有不同的数据类型但具有相同的值。

          【讨论】:

            猜你喜欢
            • 2021-10-29
            • 2018-10-23
            • 2020-08-21
            • 2018-03-19
            • 2017-11-16
            • 2019-07-07
            • 1970-01-01
            • 2010-10-22
            相关资源
            最近更新 更多