何时在 JavaScript 中使用 null 或未定义?

对于 JavaScript 何时返回 nullundefined,我真的很困惑。而且不同的浏览器返回这些信息的方式似乎也不同。

Could you please give some examples of null/undefined with the browsers that return them.

虽然我现在清楚的 undefined方面,我仍然不是100% 清楚的 null。它是否类似于一个空白值?

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

115013 次浏览

我可能漏掉了什么,但是,你只能得到 undefined

更新: 好吧,我错过了很多,试图完成:

你得到 undefined..。

... when you try to access properties of an object that don't exist:

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)就足够了。

而且不同的浏览器返回这些信息的方式似乎也不同。

Please give a concrete example.

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

这篇文章很好地解释了两者的区别,并给出了一些例子。

无效对未定义

对于不同的场景,你得到了未定义的东西:

使用 var 声明变量,但从不设置它。

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

You attempt to access a property on an object you've never set.

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

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

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

正如在另一个答案的注释中指出的那样,函数不返回值。

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

通常必须有意地在变量或属性上设置 null (参见注释,在这种情况下,它可以在没有设置的情况下出现)。此外,null 的类型为 object,unDefinition 的类型为 undefined

我还要指出,null 在 JSON 是有效的,但未定义的则不是:

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

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

定义了 财产,但它引用的对象不存在。

这是为数不多的几次你可能 没有想要测试相等-

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

but if(x!= undefined) will be true (only) for values that are not either undefined or null.

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

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等于 nullundefined,则 variable != undefined将返回 false,除非事先重新分配了 undefined

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

根据 ECMAScript 5规范:

  • Both Null and Undefined are two of the six built in types.

4.3.9未定义值

未为变量赋值时使用的基元值

4.3.11空值

表示有意缺少任何对象值的基元值

关于这个主题,规范(ecma-262)非常清楚

I found it really useful and straightforward, so that I share it: 在这里你会找到 等式算法 在这里你可以找到严格的等式算法

我在 Mozilla 开发者网站上看到“抽象的平等,严格的平等,和相同的价值”,部分相同。

希望对你有用。