当前位置:  开发笔记 > 编程语言 > 正文

为什么JavaScript中存在"null"值?

如何解决《为什么JavaScript中存在"null"值?》经验,为你挑选了5个好方法。

在JavaScript中,有两个基本上说'我不存在'的值 - undefinednull.

程序员未分配任何内容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什么?

我实际上undefined在我想要取消设置不再使用但我不想要的属性值时使用delete.我应该用null吗?



1> bobince..:

问题不是"为什么JS中存在空值" - 在大多数语言中存在某种类型的空值,并且通常认为它非常有用.

问题是,"为什么JS中存在未定义的值".使用它的主要地方:

    当你声明'var x;'时 但不要分配给它,x保持未定义;

    当你的函数获得的参数少于声明的参数时;

    当您访问不存在的对象属性时.

对于(1)和(2)*,'null'肯定也会起作用.(3)应该立即抛出一个异常,并且事实上它不会,而是返回这个奇怪的"未定义",这将在以后失败,是调试难度的重要来源.

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

然而,JavaScript最初没有异常,或者任何方式询问对象是否有某个名称下的成员 - 唯一的方法是(有时仍然是)访问该成员并查看您获得的内容.鉴于'null'已经有了一个目的,你可能想要设置一个成员,需要一个不同的带外值.所以我们有'未定义',这是有问题的,正如你指出的那样,这是另一个伟大的JavaScript'功能',我们永远无法摆脱.

当我想取消设置不再使用的属性值但我不想删除时,我实际上使用了未定义.我应该使用null吗?

是.保持'undefined'作为信号的特殊值,当其他语言可能引发异常时.

'null'通常更好,除了在一些IE DOM接口上设置'null'可能会给你一个错误.通常在这种情况下,设置为空字符串往往起作用.


Args是可扩展的.你可以随心所欲地插入一个函数,一个函数可能会迭代并全部使用它们.可以随时为对象分配新属性.这些都是强大的功能,但我怀疑抛出异常,因为你更喜欢会有很多开销.IMO,值得权衡.我花费很少的时间来检查JS中存在的时间比我通常使用更严格的语言范例.

2> Eddie Parker..:

最好的形容这里,但在汇总:

undefined是缺少类型和值,null是缺少值.

此外,如果你正在做简单的'=='比较,那么你是对的,它们也是一样的.但是尝试===,比较类型和值,你会发现差异.


@EricElliott:构造函数的返回值与falsy-ness无关,但与object-ness相关:如果返回值是一个对象,则返回; 如果它是一个像`null`或`42`的原语,则丢弃返回值并返回新创建的对象
它们不是相同的语义概念。至少对我而言,为属性分配空值的属性与不存在的属性之间存在显着差异。

3> Lei Zhao..:

我不认为有任何理由,同时拥有nullundefined,因为唯一的原因,很多人都建议(" undefined意味着没有这样的变量/属性")是无效的,在JavaScript中至少.undefined不能告诉你变量/属性是否存在.

console.log(foo);               // "ReferenceError: foo is not defined"
                                // foo does not exist
var foo;
console.log(foo);               // "undefined", a different response
console.log(foo === undefined); // "true", but it does exist

var obj = {};
console.log(obj.hasOwnProperty("foo")); // "false", no such property
obj.foo = undefined;
console.log(obj.hasOwnProperty("foo")); // "true", it exists and has the value "undefined"
console.log(obj.foo === undefined);     // "true", but it does exist

obj.bar = "delete me";
obj.bar = undefined;
console.log(obj.hasOwnProperty("bar")); // "true", not actually deleted
delete obj.bar;
console.log(obj.hasOwnProperty("bar")); // "false", deleted

如您所见,检查foo === undefined不会告诉您是否foo存在,并且设置obj.bar = undefined实际上并未删除bar.

它可能是JavaScript作者的原始意图,undefined应该代表"不存在".但是,实施并没有这样做.


这个例子实际上表明,如果您没有分配变量,它将返回“ undefined”。但是,如果您确实给它分配了undefined,则它实际上不是undefined,它是通过undefined定义的,并且引用了它。undefined和null之间的唯一区别是它们的用法和历史用途。它们都是原子的。

4> EBGreen..:

完全可能需要两者.例如,如果查询WMI,则完全可以使类具有null值的返回属性.它们被定义,它们恰好在当时保持为null.



5> Jack Ryan..:

我认为你的结论是JavaScript定义undefined为"没有这样的属性"和null"属性没有价值"是完全正确的.在与JavaScript一样动态的语言中,这是一个非常重要的区别.使用duck typing意味着我们需要能够区分不存在的属性和没有值的属性.它是我们获取类型信息的主要手段.在静态类型语言中,字段为空和字段不存在之间存在明确区别.在JavaScript中,这没有什么不同.但是,它会在运行时进行检查,并且可以在此之前进行修改.

我将不得不同意实施很奇怪,因为很多时候区别模糊.但是我认为在JavaScript中区别很重要.能够分配undefined是必不可少的.

我记得刚才读过一篇关于用JavaScript编写的在线RPG的博客文章.它使用了一些示例,其中对象被创建为现有实例的副本而不是原型(类,函数,等等),然后被更改.这真让我明白undefined在修改现有对象时有多强大,但我不记得是谁写的.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有