Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是什么使JavaScript中的原语和对象包装值都可用?_Javascript_Object_Primitive_Casting - Fatal编程技术网

是什么使JavaScript中的原语和对象包装值都可用?

是什么使JavaScript中的原语和对象包装值都可用?,javascript,object,primitive,casting,Javascript,Object,Primitive,Casting,我不久前写过一篇文章,详细介绍了JavaScript中原语和对象包装的值类型(对于数字、字符串和布尔值等)的可用性是如何带来麻烦的,包括但不限于类型转换为布尔值(例如,对象包装的NaN“,”和false实际类型转换为true) 我的问题是,面对所有这些困惑和问题,JavaScript为内置类提供这两种类型的值有什么好处 编辑:谢谢你的快速回答。我认为JavaScript的创造者打算将包装的本机代码作为一种使标量值具有子方法的方法,但它显然适得其反,导致了更多的问题。据我所知,它们从来没有用过:

我不久前写过一篇文章,详细介绍了JavaScript中原语和对象包装的值类型(对于数字、字符串和布尔值等)的可用性是如何带来麻烦的,包括但不限于类型转换为布尔值(例如,对象包装的NaN“,”和false实际类型转换为true)

我的问题是,面对所有这些困惑和问题,JavaScript为内置类提供这两种类型的值有什么好处

编辑:谢谢你的快速回答。我认为JavaScript的创造者打算将包装的本机代码作为一种使标量值具有子方法的方法,但它显然适得其反,导致了更多的问题。

据我所知,它们从来没有用过:

结果证明,键入的包装器完全没有必要,有时会令人困惑。不要使用
新布尔值
新数字
新字符串

资料来源:-附录B:不良零件(第114页)


他甚至为规范的第四版做了准备。

JavaScript和许多语言一样,有好的部分,也有坏的部分

这是一个非常糟糕的部分

嗯,打字包装真的没有什么好处,只有坏处


我们的朋友道格拉斯·克罗克福德(Douglas Crockford)一直在关注这个问题,事实上,他从一开始就反对这个问题。这就是你所需要知道的。

道格拉斯·克罗克福德虽然是世界上最聪明的人之一,但他不是上帝——他说的每一句话都不应该盲从。事实上,有一种情况下,您希望使用包装器而不是基本类型—如果您希望通过引用传递值的话

基本值总是按值传递,对象总是按引用传递。因此,如果出于某种原因需要通过引用传递数字,则可以使用数字对象来传递。在不失去引用(AFAIK)的情况下,您实际上无法更改数字的值,但是您可以像对任何对象一样随意添加其他参数-这是原始数字不支持的

var nr1 = new Number(123),
    nr2 = nr1; // reference to nr1
nr1.name = "number"; //parameter "name" for nr1 is set AFTER the initialization of nr2
alert(nr2.name); // nr2 has the same parameter as nr1

@德兰:最初,为了让精通Java的开发人员更容易采用JavaScript,做了大量的工作。这很可能是实现这一目标的一次(不成功)尝试。举一个例子来说明这是多么糟糕:一个
布尔
对象总是会求值为true,即使它的值为false。我只是将它们视为实现细节,以提供文本的原型。你也可以说,通过引用传递不可变原语的范围是有限的,因为正如你所说,这些值是不能修改的。您可以像示例中那样添加其他字段,但我想知道在实践中是否应该使用基元类型。我同意这不是最实际的用法,但我的目的是显示基元和包装器对象之间的实际差异,而不是说明thad Crockford说过一些我们必须遵守的话。我自己从不使用新号码,因为有更好的方法来完成同样的行为,但如果有人想使用新号码,我看不出她/他不应该使用新号码的任何理由。@Andris:我认为原因是这些号码“完全不必要,偶尔会让人困惑”。它们是不必要的,因为正如你所说,“有更好的方法来完成相同的行为”。它们有时会令人困惑,因为在这种情况下
b
的计算结果为true:
var b=new Boolean(false);如果(b){alert(b)}