4

不久前我写了一篇博文,详细介绍了 JavaScript 中原始值类型和对象包装值类型(例如数字、字符串和布尔值)的可用性如何导致麻烦,包括但不限于类型转换为布尔值(例如对象包装的 NaN、"" 和 false 实际上类型转换为 true)。

我的问题是,由于所有这些混乱和问题,JavaScript 对内置类具有两种类型的值有什么好处吗?

编辑:感谢您的快速回答。我认为 JavaScript 的创建者打算将封装的原生对象作为一种使标量值​​具有子方法的方法,但它显然适得其反,导致更多问题。

4

3 回答 3

5

根据Douglas Crockford的说法,它们从来没有用处:

类型化的包装器被证明是完全没有必要的,并且有时会令人困惑。不要使用new Booleanornew Numbernew String

来源:JavaScript:好的部分- 附录 B:坏部分(第 114 页)。

他甚至建议在ECMAScript规范的第 4 版中弃用它们。

于 2010-05-02T10:50:14.523 回答
0

道格拉斯·克罗克福德(Douglas Crockford)虽然是最聪明的人之一,但他不是上帝——他所说的一切都不应该被盲目地遵循。事实上,在一种情况下,您更喜欢包装器而不是原始类型 - 如果您想通过引用传递值。

原始值始终按值传递,对象按引用传递。因此,如果由于某种原因您需要通过引用传递数字,那么您可以使用 Number 对象来完成。您实际上无法在不丢失引用 (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
于 2010-05-02T11:30:02.680 回答
0

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

这是非常糟糕的部分之一。

恕我直言,打字包装器确实没有太多好处,只有伤害。

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

于 2010-05-02T10:52:20.813 回答