【发布时间】:2009-01-20 16:12:46
【问题描述】:
在 JavaScript 中,有两个值基本上表示“我不存在” - undefined 和 null。
程序员没有分配任何东西的属性将是undefined,但为了使属性成为null,必须显式分配null。
我曾经认为null 是有必要的,因为undefined 是一个原始值,而null 是一个对象。不是,即使 typeof null 会产生 'object':实际上,两者都是原始值 - 这意味着 undefined 和 null 都不能从构造函数返回,因为两者都将转换为空对象(一个必须抛出错误才能在构造函数中声明失败)。
它们在布尔上下文中也都评估为false。我能想到的唯一真正区别是,在数字上下文中,一个计算为 NaN,另一个计算为 0。
那么为什么同时存在undefined 和null 如果这只会让程序员在试图找出是否已设置属性时错误地检查null 感到困惑?
我想知道的是,是否有人有一个合理的例子,说明有必要使用 null 而不能使用 undefined 来表达。
所以普遍的共识似乎是undefined 表示“没有这样的财产”,而null 表示“财产确实存在,但没有价值”。
如果 JavaScript 实现实际上会强制执行此行为,我可以接受 - 但 undefined 是一个完全有效的原始值,因此可以轻松地将其分配给现有属性以破坏此契约。因此,如果要确定某个属性是否存在,则无论如何都必须使用in 运算符或hasOwnProperty()。再说一遍:undefined 和 null 的单独值有什么实际用途?
当我想取消设置不再使用但不想delete 的属性值时,我实际上使用了undefined。我应该改用null 吗?
【问题讨论】:
-
回答你的最后一个问题:不,你不应该将属性设置为
undefined。 -
"undefined" 只是全局范围内的一个变量,其原始值是“undefined”。可以为变量定义另一个值:{ undefined="Hello"; alert(undefined);} 一种更可靠的未定义测试方法:{ if (typeof myvar === "undefined") alert("undefined")}
-
请参阅ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 中的第 4.3.9 - 12 节了解 undefined/null,了解 15.1.1.3 了解全局范围内的变量“undefined”。
-
您应该删除一个对象或将其设置为 null 如果这更有意义,但不要设置为 undefined。
-
In JavaScript, there are two values which basically say 'I don't exist' - undefined and null.不,只有undefined这么说。
标签: javascript null language-features undefined