我已经写 JavaScript 很长时间了,我从来没有理由使用null
. 这似乎undefined
总是更可取,并且以编程方式服务于相同的目的。使用null
而不是的一些实际原因是undefined
什么?
在 JavaScript 中使用 null 而不是 undefined 的原因是什么?
我真的没有答案,但根据Nicholas C. Zakas在他的书“ Professional JavaScript for Web Developers ”第 30 页的说法:
当定义一个以后要保存一个对象的变量时,建议将变量初始化
null
为与其他任何东西相反。这样,您可以显式检查该值null
以确定该变量是否已在以后填充了对象引用
null
并且undefined
本质上是两个不同的值,它们意味着同一件事。唯一的区别是在约定的你如何使用它们的系统。正如一些人所提到的,有些人使用null
“无对象”来表示有时您可能会得到一个对象,而未定义意味着没有预期的对象(或存在错误)。我的问题是它完全随意,完全没有必要。
也就是说,有一个主要区别 - 未初始化的变量(包括未传递参数的函数参数等)始终未定义。
这就是为什么在我的代码中我从不使用 null 除非我无法控制的东西返回 null (例如正则表达式匹配)。这样做的美妙之处在于它简化了很多事情。我永远不必检查是否x === undefined
或x === null
。如果您习惯于使用==
或简单地使用诸如 之类的东西if(x) ...
,请停止使用。
!x
对于空字符串,0
, null
,将评估为 true NaN
- 即您可能不想要的东西。如果您想编写不糟糕的 javascript,请始终使用三重等号,===
而不要使用null
(useundefined
代替)。它会让你的生活更轻松。
归根结底,因为null
和 都undefined
强制为相同的值 ( Boolean(undefined) === false && Boolean(null) === false
),所以从技术上讲,您可以使用任何一个来完成工作。但是,有正确的方法,IMO。
将 的用法留给
undefined
JavaScript 编译器。undefined
用于描述不指向引用的变量。这是 JS 编译器会照顾你的事情。在编译时,JS 引擎会将所有提升的变量的值设置为undefined
. 当引擎逐步执行代码并且值变得可用时,引擎会将相应的值分配给相应的变量。对于那些没有找到值的变量,这些变量将继续维护对原语的引用undefined
。仅当您明确希望将变量的值表示为“无值”时才使用 null。
正如@com2gz 所说:
null
用于以编程方式定义空的东西。undefined
意思是说引用不存在。一个null
value有一个定义的参考,以“无”。如果您正在调用对象的不存在的属性,那么您将获得undefined
. 如果我故意让该属性为空,那么它必须是null
为了让您知道它是故意的。
TLDR;不要使用undefined
原语。当您在未赋值的情况下声明变量或尝试访问没有引用的对象的属性时,JS 编译器会自动为您设置一个值。另一方面,null
当且仅当您有意希望变量“没有值”时才使用。
我从来没有明确地将任何东西设置为 undefined (而且我在我与之交互的许多代码库中都没有遇到过这种情况)。此外,我很少使用null
. 我唯一使用null
的时候是当我想将函数的参数值表示为没有值时,即:
function printArguments(a,b) {
console.log(a,b);
}
printArguments(null, " hello") // logs: null hello
未定义是不存在事物概念的地方;它没有类型,并且在该范围内之前从未被引用过;null 是已知事物存在的地方,但它没有value。
每个人都有自己的编码方式和自己的内部语义,但多年来我发现这是我给提出这个问题的人的最直观的建议:当有疑问时,做 JavaScript 所做的。
假设您正在使用对象属性,例如 jQuery 插件的选项……问问自己 JavaScript 赋予尚未定义的属性什么值 - 答案是undefined
. 所以在这种情况下,我会用“未定义”来初始化这些类型的东西,以与 JavaScript 保持一致(对于变量,你可以用var myVar;
代替var myVar = undefined;
)。
现在假设您正在进行 DOM 操作……JavaScript 为不存在的元素分配什么值?答案是null
。如果您正在创建一个占位符变量,该变量稍后将保存对与 DOM 相关的元素、文档片段或类似内容的引用,那么我将使用该值进行初始化。
如果您使用 JSON,则需要进行特殊情况处理:对于未定义的属性值,您应该将它们设置为""
或null
因为值undefined
不被视为正确的 JSON 格式。
话虽如此,正如之前的一位海报所表达的那样,如果您发现自己在蓝色月亮中使用null
或undefined
多次初始化东西,那么也许您应该重新考虑如何编写应用程序。