在 JavaScript 中使用 null 而不是 undefined 的原因是什么?

IT技术 javascript null undefined
2021-03-13 10:08:40

我已经写 JavaScript 很长时间了,我从来没有理由使用null. 这似乎undefined总是更可取,并且以编程方式服务于相同的目的。使用null而不是的一些实际原因undefined什么?

6个回答

我真的没有答案,但根据Nicholas C. Zakas在他的书Professional JavaScript for Web Developers第 30 页的说法

当定义一个以后要保存一个对象的变量时,建议将变量初始化null为与其他任何东西相反。这样,您可以显式检查该值null以确定该变量是否已在以后填充了对象引用

我唯一的问题(自从我 15 年前开始使用 JavaScript 以来)是您经常需要测试undefinednull. 这仍然很烦人。我避免将变量分配给null只是为了减少额外null测试的数量
2021-04-18 10:08:40
+1 是的,我同意,我总是尽量记住将 vars 初始化为 null。然后我(非常)确定这undefined意味着发生了灾难。只是恕我直言。
2021-04-19 10:08:40
@GMan - 这是==比较(相对于===)有意义的唯一地方:(v == nullv == undefined)将检查空值或未定义。
2021-04-28 10:08:40
另一方面,您还可以使用初始化变量var myVar;并显式检查该值undefined以确定稍后是否已用对象引用填充它。我的观点是这完全是学术性的——你可以采用任何一种方式,任何以一种方式提出建议而不是另一种方式的人只是在推动他们自己的惯例。
2021-05-05 10:08:40
@Pete - 但它没有告诉你关于“灾难”的任何信息,那有什么意义呢?如果您知道该函数遵循约定,则只能做出该假设。
2021-05-14 10:08:40

null并且undefined本质上是两个不同的值,它们意味着同一件事。唯一的区别是在约定的你如何使用它们系统。正如一些人所提到的,有些人使用null“无对象”来表示有时您可能会得到一个对象,而未定义意味着没有预期的对象(或存在错误)。我的问题是它完全随意,完全没有必要。

也就是说,有一个主要区别 - 未初始化的变量(包括未传递参数的函数参数等)始终未定义。

这就是为什么在我的代码中我从不使用 null 除非我无法控制的东西返回 null (例如正则表达式匹配)。这样做的美妙之处在于它简化了很多事情。我永远不必检查是否x === undefinedx === null如果您习惯于使用==或简单地使用诸如 之类的东西if(x) ... ,请停止使用。

!x对于空字符串,0, null,将评估为 true NaN- 即您可能不想要的东西。如果您想编写不糟糕的 javascript,请始终使用三重等号,===而不要使用null(useundefined代替)。它会让你的生活更轻松。

@com2ghz 所以 JS 是一种可怕的语言,因为它同时具有 null 和 undefined?在所有主要语言中,我可以数出数十种糟糕的语言决策,js 也不例外。我真的从来不需要或不想在我的代码中使用虚假检查,并且总是使用===or !==如果您知道如何使用 JS,那么它是一种极具表现力的语言。
2021-04-21 10:08:40
这就是为什么 JS 是一种可怕的语言。就像您说的那样,许多图书馆都有自己的理念,但您为 1 个项目包含了许多图书馆。所以你会遇到这些库的许多约定。您需要进行多少次不同的虚假检查。将空对象连接到字符串并获得“空”作为字符串不会是最后一次。或者将 0 作为数值传递并想知道为什么 IF 语句处理的 t 为假。
2021-04-27 10:08:40
我不同意这一点。Null 用于以编程方式定义为空的内容。未定义的意思是说引用不存在。空值具有对“无”的定义引用。如果您正在调用对象的不存在的属性,那么您将得到未定义。如果我有意使该属性为空,那么它必须为空,以便您知道它是故意的。许多 javascript 库都是这样工作的。
2021-04-29 10:08:40
对。我刚刚了解到null/undefined二分法是必要的,因为 JS 的初始版本没有hasOwnPropertyin运算符。既然如此,我真的不明白为什么其中一个没有在 ES6 或我见过的任何 ES7 提案中被废除。
2021-05-07 10:08:40
@com2ghz 您所描述的是众多哲学中的一种。许多 js 库确实以这种方式工作。许多人也不会那样工作。在 javascript 中,您可以像使用 null 一样轻松地将显式未定义值存储在对象或数组中。两者的含义完全且完全取决于上下文。IE 他们的意思是你想要他们的意思。
2021-05-11 10:08:40

归根结底,因为null和 都undefined强制为相同的值 ( Boolean(undefined) === false && Boolean(null) === false),所以从技术上讲,您可以使用任何一个来完成工作。但是,有正确的方法,IMO。

  1. 将 的用法留给undefinedJavaScript 编译器。

    undefined用于描述不指向引用的变量。这是 JS 编译器会照顾你的事情。在编译时,JS 引擎会将所有提升的变量的值设置为undefined. 当引擎逐步执行代码并且值变得可用时,引擎会将相应的值分配给相应的变量。对于那些没有找到值的变量,这些变量将继续维护对原语的引用undefined

  2. 仅当您明确希望将变量的值表示为“无值”时才使用 null。

    正如@com2gz 所说:null用于以编程方式定义空的东西。undefined意思是说引用不存在。一个nullvalue有一个定义的参考,以“无”。如果您正在调用对象的不存在的属性,那么您将获得undefined. 如果我故意让该属性为空,那么它必须是null为了让您知道它是故意的。

TLDR;不要使用undefined原语。当您在未赋值的情况下声明变量或尝试访问没有引用的对象的属性时,JS 编译器会自动为您设置一个值。另一方面,null当且仅当您有意希望变量“没有值”时才使用

我从来没有明确地将任何东西设置为 undefined (而且我在我与之交互的许多代码库中都没有遇到过这种情况)。此外,我很少使用null. 我唯一使用null的时候是当我想将函数的参数值表示为没有值时,即:

function printArguments(a,b) {
  console.log(a,b);
}

printArguments(null, " hello") // logs: null hello
经过多年只使用undefined和假装null不存在,我想我开始倾向于这样的答案
2021-04-26 10:08:40
这应该是选定的答案
2021-05-08 10:08:40

未定义是不存在事物概念的地方;它没有类型,并且在该范围内之前从未被引用过;null 是已知事物存在的地方,但它没有value。

你怎么知道是否尝试分配一个值,但它失败了,而是分配了undefined
2021-05-07 10:08:40

每个人都有自己的编码方式和自己的内部语义,但多年来我发现这是我给提出这个问题的人的最直观的建议:当有疑问时,做 JavaScript 所做的

假设您正在使用对象属性,例如 jQuery 插件的选项……问问自己 JavaScript 赋予尚未定义的属性什么值 - 答案是undefined. 所以在这种情况下,我会用“未定义”来初始化这些类型的东西,以与 JavaScript 保持一致(对于变量,你可以用var myVar;代替var myVar = undefined;)。

现在假设您正在进行 DOM 操作……JavaScript 为不存在的元素分配什么值?答案是null如果您正在创建一个占位符变量,该变量稍后将保存对与 DOM 相关的元素、文档片段或类似内容的引用,那么我将使用该值进行初始化。

如果您使用 JSON,则需要进行特殊情况处理:对于未定义的属性值,您应该将它们设置为""null因为值undefined不被视为正确的 JSON 格式。

话虽如此,正如之前的一位海报所表达的那样,如果您发现自己在蓝色月亮中使用nullundefined多次初始化东西,那么也许您应该重新考虑如何编写应用程序。

虽然这是一个很好的立场,但我想添加这个答案:stackoverflow.com/a/37980662/883303
2021-04-26 10:08:40
@FrederikKrautwald 感谢您提供链接——这是一个非常清晰的描述。
2021-05-16 10:08:40