为什么 JavaScript 有原语的盒装版本?
就像,我很擅长true和false,为什么我需要
new Boolean(true) === new Boolean(true) // false
Run Code Online (Sandbox Code Playgroud)
我知道像 Java 和 Objective-C 这样的语言有一些封闭的东西,因为你不能将基元放入与非基元相同的数据结构中。但 JS 总是允许混合事物的数组[1, 2, {}, ""],并且任何事物都可以作为对象中键的值。
我并不是在寻求理由:大写的“B”当然
Boolean是无稽之谈。但我真的很好奇这是怎么发生的。当时肯定是有原因的。
JavaScript 已装箱原始类型,以便它们的实例可以从其原型继承属性(尤其是方法),这非常适合属性访问(和方法调用)时接收器值的自动装箱。
\n\n例如
\n\nBoolean.prototype.demo = "!";\nconsole.log(true.demo);\nconsole.log(true.toString());\nRun 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
然而,他实际上对此相当不满意,并且想要更改 ES4 的类型系统(众所周知,这从未发生过)。
\n\n实际上,这个问题甚至可以反过来表述:“为什么 JavaScript 已经拥有Boolean、Number和String对象了,还要拥有原始类型? ”。它们实际上根本没有必要,许多语言没有它们也能做得很好,只是遵循面向对象的一切都是对象的格言——包括启发 JS 的语言。
我们再次向 Brendan Eich 学习:
\n\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 错误,以及原始类型与对象的区别(例如,
\nstring与String),都是不幸的。