簡體   English   中英

為什么 JavaScript 有原語的盒裝版本?

[英]Why does JavaScript have boxed versions of primitives?

為什么 JavaScript 有原語的盒裝版本?

就像,我有良好的truefalse ,為什么我需要

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

我知道像 Java 和 Objective-C 這樣的語言有盒裝的東西,因為你不能將原語放入與非原語相同的數據結構中。 但是 JS 總是允許混合數組[1, 2, {}, ""]並且任何東西都可以是對象中鍵的值。

我不是在尋求理由:當然大寫的“B” Boolean是無稽之談。 但我真的很好奇這是怎么發生的。 當時肯定是有原因的。

JavaScript 將原始類型裝箱,以便它們的實例可以從其原型繼承屬性(尤其是方法),這與屬性訪問(和方法調用)時接收器值的自動裝箱非常吻合。

例如

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

將此與undefined.toString()形成對比,后者不是自動裝箱的。

這個原因得到了語言的創造者的證實

所謂的基本類型Boolean、Number和String各有一個對應的Object子類型:Boolean、Number和String。 當原始值用作對象時,它會被相應對象子類型的新實例自動“裝​​箱”或包裝。 當在適當的原始類型上下文中使用時,盒子/包裝器會轉換回原始值。

然而,他實際上對此很不滿意,並想改變 ES4 的類型系統(我們都知道,這從未發生過)。

這個問題實際上甚至可以反過來提出:“當 JavaScript 已經有BooleanNumberString對象時,為什么它還有原始類型? ”。 它們真的根本沒有必要,許多語言沒有它們也能很好地工作,並且只是生活在面向對象的一切都是對象格言 - 包括那些為 JS 提供靈感的語言。

我們再次向 Brendan Eich 學習

上層工程管理人員的命令是語言必須“看起來像 Java”。 […]

我並不驕傲,但我很高興我選擇了 Scheme-ish 一流函數和 Self-ish(盡管是單一的)原型作為主要成分。 不幸的是,Java 的影響,尤其是 y2k 日期錯誤以及原始與對象的區別(例如, stringString )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM