为什么 JavaScript 有原语的盒装版本?

Max*_*ber 6 javascript

为什么 JavaScript 有原语的盒装版本?

就像,我很擅长truefalse,为什么我需要

new Boolean(true) === new Boolean(true) // false
Run Code Online (Sandbox Code Playgroud)

我知道像 Java 和 Objective-C 这样的语言有一些封闭的东西,因为你不能将基元放入与非基元相同的数据结构中。但 JS 总是允许混合事物的数组[1, 2, {}, ""],并且任何事物都可以作为对象中键的值。

我并不是在寻求理由:大写的“B”当然Boolean是无稽之谈。但我真的很好奇这是怎么发生的。当时肯定是有原因的。

Ber*_*rgi 9

JavaScript 已装箱原始类型,以便它们的实例可以从其原型继承属性(尤其是方法),这非常适合属性访问(和方法调用)时接收器值的自动装箱。

\n\n

例如

\n\n
Boolean.prototype.demo = "!";\nconsole.log(true.demo);\nconsole.log(true.toString());\n
Run Code Online (Sandbox Code Playgroud)\n\n

将此undefined.toString()与不自动装箱的 进行对比。

\n\n

这个原因得到了该语言的创建者的证实

\n\n
\n

所谓的基本类型 Boolean、Number 和 String 各有一个对应的 Object 子类型:分别是 Boolean、Number 和 String。当原始值用作对象时,它会自动 \xe2\x80\x9cboxed\xe2\x80\x9d 或由相应对象子类型的新实例包装。当在适当的原始类型上下文中使用时,盒子/包装器将转换回原始值。

\n
\n\n

然而,他实际上对此相当不满意,并且想要更改 ES4 的类型系统(众所周知,这从未发生过)。

\n\n

实际上,这个问题甚至可以反过来表述:“为什么 JavaScript 已经拥有BooleanNumberString对象了,还要拥有原始类型? ”。它们实际上根本没有必要,许多语言没有它们也能做得很好,只是遵循面向对象的一切都是对象的格言——包括启发 JS 的语言。

\n\n

我们再次向 Brendan Eich 学习

\n\n
\n

上层工程管理部门的命令是该语言必须\n\xe2\x80\x9c 看起来像Java\xe2\x80\x9d。[\xe2\x80\xa6]

\n\n

我\xe2\x80\x99m并不自豪,但我\xe2\x80\x99m很高兴我选择了Scheme-ish一流\n函数和Self-ish(尽管是单一的)原型作为主要\n成分。Java 的影响,特别是 y2k Date 错误,以及原始类型与对象的区别(例如,stringString),都是不幸的。

\n
\n