gpt4 book ai didi

javascript - 为什么在 JavaScript 中有一个 `null` 值?

转载 作者:IT王子 更新时间:2023-10-29 02:40:26 26 4
gpt4 key购买 nike

在 JavaScript 中,有两个值基本上表示“我不存在”——undefinednull

程序员未分配任何内容的属性将是未定义,但为了使属性变为nullnull必须明确分配给它。

我曾经认为需要null因为undefined是一个原始值而null是一个对象。它不是,即使 typeof null 将产生 'object':实际上,两者都是原始值 - 这意味着既不是 undefined 也不是 null 可以从构造函数返回,因为两者都将被转换为一个空对象(必须抛出一个错误来声明构造函数失败)。

它们在 bool 上下文中的计算结果也都为 false。我能想到的唯一真正区别是,在数字上下文中,一个计算为 NaN,另一个计算为 0

那么,为什么同时存在 undefinednull 如果这只会让那些在试图找出一个属性是否已设置?

我想知道的是,是否有人有一个合理的例子,其中有必要使用 null 而不能用 undefined 来表达。

所以普遍的共识似乎是 undefined 意味着“没有这样的属性”,而 null 意味着“该属性确实存在,但没有值(value)”。

如果 JavaScript 实现实际上强制执行此行为,我可以接受 - 但 undefined 是一个完全有效的原始值,因此可以轻松地将其分配给现有属性以打破此契约。因此,如果您想确定某个属性是否存在,您无论如何都必须使用 in 运算符或 hasOwnProperty()。所以再一次:undefinednull 的单独值的实际用途是什么?

当我想取消设置不再使用但又不想删除的属性值时,我实际上使用了undefined。我应该改用 null 吗?

最佳答案

真正的问题不是“为什么在 JS 中有空值”——大多数语言中都有某种类型的空值,它通常被认为非常有用。

问题是,“为什么在 JS 中有一个 undefined 值”。主要使用场所:

  1. 当您声明 var x; 但不分配给它时,x 保持未定义状态;
  2. 当你的函数得到的参数比它声明的少时;
  3. 当您访问一个不存在的对象属性时。

null 对于 (1) 和 (2)* 肯定同样有效。 (3) 确实应该立即抛出异常,而事实上它并没有返回这个稍后会失败的奇怪的 undefined,这是调试困难的一个重要来源。

*:您也可以争辩说 (2) 应该抛出异常,但是您必须为默认/变量参数提供更好、更明确的机制。

然而,JavaScript 最初并没有异常,也没有任何方式来询问对象是否有某个名称下的成员 - 唯一的方式是(有时仍然是)访问成员并查看你得到了什么。鉴于 null 已经有了一个目的,并且您可能很想为其设置一个成员,因此需要一个不同的带外值。所以我们有 undefined,正如您指出的那样,它是有问题的,它是我们永远无法摆脱的另一个很棒的 JavaScript“功能”。

I actually use undefined when I want to unset the values of properties no longer in use but which I don't want to delete. Should I use null instead?

是的。保留 undefined 作为特殊值,用于在其他语言可能抛出异常时发出信号。

null 通常更好,除了在某些 IE DOM 界面上,将某些内容设置为 null 可能会给您带来错误。通常在这种情况下设置为空字符串往往会起作用。

关于javascript - 为什么在 JavaScript 中有一个 `null` 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/461966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com