JavaScript 中何时使用 null 或 undefined?

IT技术 javascript null undefined
2021-03-06 11:55:45

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

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

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

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

6个回答

我发现其中一些答案含糊不清且复杂,我发现确定这些问题的最佳方法是打开控制台并自己测试。

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 != null如果variable等于nullor将始终返回 false undefined,而variable != undefined如果variable等于nullor 或undefinedUNLESSundefined事先重新分配则返回 false

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

根据 ECMAScript 5 规范:

  • 这两个NullUndefined两个内置的类型六。

4.3.9 未定义值

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

4.3.11 空值

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

很棒的一点;您可以意外地将 undefined 设置为一个值,并且不会得到任何有用的错误来追踪它的来源。
2021-05-07 11:55:45

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

属性的定义,但它指的是对象不存在。

这是为数不多的几次你可能希望测试equality-

if(x!==undefined) 为空值时为真

if(x!= undefined)对于不是undefined或 的值(仅)为真null

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

您在各种情况下都未定义:

你用 var 声明了一个变量,但从不设置它。

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

您尝试访问从未设置过的对象上的属性。

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

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

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

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

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

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

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

JSON.parse(undefined); //syntax error
JSON.parse(null); //null
@Andy - +1,我试图想一个案例,你可以null在不输入的情况下到达任何地方:)
2021-04-22 11:55:45
可能不值得一提,但是 DOM 对象可以使用null其成员的值进行初始化最值得注意的是事件(尽管由于错误而在 Firefox 中并非如此) - 请参阅document.createElement("a").onclick- 但也适用于其他一些属性。
2021-04-29 11:55:45
@AndyE:我同意,这绝对值得一提。
2021-04-29 11:55:45
@Felix King - 这对大多数人来说是微不足道的:)
2021-05-09 11:55:45
@AndyE:是的,但是,DOM 对象不是 JavaScript 的一部分;)
2021-05-16 11:55:45

我可能会遗漏一些东西,但是 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)。

不同的浏览器似乎也以不同的方式返回这些。

请举一个具体的例子。

国王 - 我知道你知道这一点,但是if(variable)当你确定任何非空/非未定义值不会评估为假时,这只是一个合理的测试。您确实说过“取决于可能的值”,但也许可以说得更清楚?
2021-04-25 11:55:45
此外,没有 return 语句或只是“返回”没有值的函数。
2021-05-17 11:55:45

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

我发现它非常有用和简单,所以我分享它: - 在这里你会找到平等算法 - 在这里你会找到严格平等算法

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

希望对你有帮助。

感谢您提醒我抽象与严格平等。今天是疑惑了一会儿,为什么我传递参数为null==undefinedDuh-null ==undefined,但不是 ===undefined或者你的话,null抽象等于undefined但不严格等于undefined
2021-05-05 11:55:45