【问题标题】:When is null or undefined used in JavaScript? [duplicate]JavaScript 中何时使用 null 或 undefined? [复制]
【发布时间】:2011-09-19 17:30:55
【问题描述】:

我真的很困惑 JavaScript 何时返回 nullundefined。不同的浏览器似乎也会以不同的方式返回这些内容。

您能否提供一些null/undefined 的示例以及返回它们的浏览器。

虽然我现在对undefined 方面很清楚,但我对null 仍然不是 100% 清楚。是不是类似于空值?

例如您有一个没有设置任何值的文本框。现在,当您尝试访问它的值时,它会是null 还是undefined,它们是否相似?

【问题讨论】:

  • 你有concreate案例吗?这与事件有什么关系?
  • 请参阅下面的答案以获取示例,但简短的是:undefined 表示“不存在”。 null 是一个故意设置值。
  • 对不起,尽管这个问题被标记为重复,但我在此页面或重复存在的页面上找不到正确的答案。所以,不要标记答案,请再读一遍。以便未来的访客能够找到答案。或者,如果作者想知道区别 - 请提出您的问题。

标签: javascript null undefined


【解决方案1】:

我发现其中一些答案是模糊和复杂的,我发现确定这些问题的最好方法就是打开控制台并自己测试。

var x;

x == null            // true
x == undefined       // true
x === null           // false
x === undefined      // true

var y = null;

y == null            // true
y == undefined       // true
y === null           // true
y === undefined      // false

typeof x             // 'undefined'
typeof y             // 'object'

var z = {abc: null};

z.abc == null        // true
z.abc == undefined   // true
z.abc === null       // true
z.abc === undefined  // false

z.xyz == null        // true
z.xyz == undefined   // true
z.xyz === null       // false
z.xyz === undefined  // true

null = 1;            // throws error: invalid left hand assignment
undefined = 1;       // works fine: this can cause some problems

所以这绝对是 JavaScript 更微妙的细微差别之一。如您所见,您可以覆盖undefined 的值,使其与null 相比有些不可靠。据我所知,使用== 运算符,您可以可靠地交替使用nullundefined。不过由于null的优点是不能重定义,所以在使用==的时候可能会用到。

例如,如果variable 等于nullundefinedvariable != null 将始终返回false,而如果variable 等于null 或@987654336,variable != undefined 将返回false @ 除非 undefined 事先被重新分配。

如果您需要确保某个值实际上是undefined(而不是null),则可以可靠地使用=== 运算符来区分undefinednull

根据 ECMAScript 5 规范:

  • NullUndefined 都是六种内置类型中的两种。

4.3.9 未定义值

变量未赋值时使用的原始值

4.3.11 空值

表示有意不存在任何对象值的原始值

【讨论】:

  • 好点;您可以意外地将 undefined 设置为一个值,并且不会得到任何有用的错误来追踪它的来源。
【解决方案2】:

当调用不返回节点对象时,DOM 方法 getElementById()nextSibling()childNodes[n]parentNode() 等返回 null(已定义但没有值)。

属性已定义,但它引用的对象不存在。

这是您可能想要测试相等性的少数几次之一-

if(x!==undefined) 对于空值将是 true

if(x!= undefined) 将(仅)对于不是undefinednull 的值为真。

【讨论】:

  • 当然,第二个实例 if(x != undefined) 是 != 尝试对 x 进行类型转换以与 undefined 进行比较的副作用。在我看来,这似乎是一个红鲱鱼。 null 不应等于未定义。在我看来,它们是不同的东西
  • 这是危险的和次优的。这是有效的,因为“未定义”确实是未定义的。但是“未定义”不是 JavaScript 中的保留字。所以你可以这样做: var undefined = "Magic!"; // 是的,这有效 现在您的代码可能有效,也可能无效。最好做一个 typeof(x) !== "undefined"
【解决方案3】:

您在各种情况下都没有定义:

您使用 var 声明了一个变量,但从未设置它。

var foo; 
alert(foo); //undefined.

你试图访问一个你从未设置过的对象的属性。

var foo = {};
alert(foo.bar); //undefined

您尝试访问从未提供过的参数。

function myFunction (foo) {
  alert(foo); //undefined.
}

正如 cwolves 在对另一个答案的评论中指出的那样,不返回值的函数。

function myFunction () {
}
alert(myFunction());//undefined

通常必须在变量或属性上有意设置空值(请参阅 cmets 以了解它可以在未设置的情况下出现的情况)。此外,null 的类型为 object,而 undefined 的类型为 undefined

我还要注意 null 在 JSON 中是有效的,但 undefined 不是:

JSON.parse(undefined); //syntax error
JSON.parse(null); //null

【讨论】:

  • 这可能不值得一提,但 DOM 对象可以使用其成员的 null 值进行初始化。最值得注意的是事件(尽管由于错误而在 Firefox 中不是这种情况) - 请参阅document.createElement("a").onclick - 以及其他一些属性。
  • @Andy - +1,我想一个例子,你可以在任何地方得到null 而不用输入它:)
  • @AndyE:是的,但是,DOM 对象不是 JavaScript 的一部分;)
  • @Felix King - 这对大多数人来说都是小事 :)
  • @AndyE:我同意,这绝对值得一提。
【解决方案4】:

我可能遗漏了一些东西,但是 afaik,你只能得到 undefined

更新:好的,我错过了很多,正在努力完成:

你会得到undefined...

...当您尝试访问不存在的对象的属性时:

var a = {}
a.foo // undefined

...当你声明了一个变量但没有初始化它时:

var a;
// a is undefined

...当您访问未传递值的参数时:

function foo (a, b) {
    // something
}

foo(42); // b inside foo is undefined

...当函数没有返回值时:

function foo() {};
var a = foo(); // a is undefined

可能是某些内置函数在某些错误时返回null,但如果是这样,那么它会被记录在案。 null 是 JavaScript 中的具体值,undefined 不是。


通常您不需要区分它们。根据变量的可能值,使用if(variable) 来测试是否设置了值就足够了(nullundefined 都评估为false)。

而且不同的浏览器似乎返回这些不同。

请举个具体的例子。

【讨论】:

  • 另外,函数没有返回语句或只是“返回”没有值。
  • King - 我知道你知道这一点,但if(variable) 只是一个合理的测试,当你确定任何非空/非未定义值不会评估为假时。您确实说过“取决于可能的值”,但也许可以更清楚地说明?
【解决方案5】:

关于这个主题的规范(ecma-262)很清楚

我发现它非常有用且简单明了,所以我分享它: - 在这里你会找到Equality algorithm - 在这里你会找到Strict equality algorithm

我在阅读 Mozilla 开发者网站上的“抽象相等、严格相等和相同值”时遇到了它,部分相同。

希望对你有用。

【讨论】:

  • 感谢您提醒我抽象与严格相等。今天困惑了一会儿,为什么我作为null 传递的参数是==undefined。呃 - null ==undefined,但不是 ===undefined!或者用你的话来说,null抽象地等于undefined,但不严格地等于undefined
【解决方案6】:

一个没有定义的属性是未定义的。 null 是一个对象。它的类型为空。 undefined 不是对象,它的类型是未定义的。

这是一篇很好的文章,解释了差异并给出了一些例子。

null vs undefined

【讨论】:

  • 那篇文章完全错误。是说当人们写if (foo == null)时,他们真正的意思是if (!foo),这与它无关。仅当 foo 未定义或为 null 时,第一个为真,但如果 foo = 空字符串、零、假或 NaN,则最后一个也为真。
  • null 不是一个对象,尽管typeof 说了什么。
猜你喜欢
  • 2020-07-17
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2016-08-25
  • 2018-10-23
  • 1970-01-01
  • 2022-12-14
  • 2011-12-04
相关资源
最近更新 更多