gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:15:31 24 4
gpt4 key购买 nike

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

比如,我很擅长 truefalse,为什么我需要

new Boolean(true) === new Boolean(true) // false

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

I'm not asking for a justification: of course capital "B" Boolean is nonsense. But I'm genuinely curious about how this happened. There must have been a reason at the time.

最佳答案

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

例如

Boolean.prototype.demo = "!";
console.log(true.demo);
console.log(true.toString());

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

这个原因是confirmed by the creator of the language :

the so-called primitive types Boolean, Number, and String each have a corresponding Object subtype: Boolean, Number, and String respectively. When a primitive value is used as an object, it is automatically “boxed” or wrapped by a new instance of the corresponding object subtype. When used in an appropriate primitive type context, the box/wrapper converts back to the primitive value.

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

这个问题实际上什至可以反过来构思:“当 JavaScript 已经有了 BooleanNumberString 对象?”。它们真的根本不是必需的,许多语言没有它们也能很好地运行,并且只是遵循面向对象的一切都是对象的格言——包括 JS 的灵感来源的语言。

再次,we learn from Brendan Eich :

The diktat from upper engineering management was that the language must “look like Java”. […]

I’m not proud, but I’m happy that I chose Scheme-ish first-class functions and Self-ish (albeit singular) prototypes as the main ingredients. The Java influences, especially y2k Date bugs but also the primitive vs. object distinction (e.g., string vs. String), were unfortunate.

关于javascript - 为什么 JavaScript 有原语的盒装版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60960197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com