原始值被称为单例的现象是什么?

What is the phenomenon of primitive values being singletons called?

本文关键字:是什么 被称为 单例 原始      更新时间:2023-09-26

根据我对JavaScript(以及Ruby和Python)的理解,在任何给定时间,内存中都只存在给定原始值的单个实例。例如,如果实例化一个数字,则会在内存中创建该数字。重新实例化该数字的任何其他变量实际上都将引用内存中已创建的相同数字。这可以通过以下示例进行说明:

var x = 5;
var y = 5;
Object.is(x, y);
>>>true

原始值被单例的现象叫什么?

你的测试有缺陷。 当要Object.is()的两个参数都是数字时,它将返回两个参数的值的比较。 这不是对两个变量是否由同一物理内存表示的测试。

您可以在 MDN 上阅读此处,了解当两个参数都是数字时比较的工作原理。 您还可以在同一页面上查看填充代码。

如果你想看到 Object.is() 的实际 ECMAScript 规范,你可以在这里阅读。

在该规范中,Object.is()使用SameValue(x,y)记录为以下步骤序列:

19.1.2.10 Object.is ( 值 1, 值 2 )

当使用参数值 1 和值 2 调用 is 函数时 将采取以下步骤:

返回 SameValue(值 1, 值 2)。

这是SameValue()部分:

7.2.9 相同值(x, y)

内部比较抽象操作 SameValue(x, y),其中 x 和 y 是 ECMAScript 语言的值,产生真或假。这样的比较是 执行如下:

  1. ReturnIfAbrupt(x).
  2. ReturnIfAbrupt(y).
  3. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  4. 如果 Type(x) 是"未定义",则返回 true。
  5. 如果 Type(x) 为 Null,则返回 true。
  6. 如果 Type(x) 是数字,则 一个。如果 x 是 NaN,y 是 NaN,则返回 true。 b.如果 x 为 +0,y 为 -0,则返回 false。 c.如果 x 为 -0,y 为 +0,则返回 false。 d.如果 x 与 y 的数值相同,则返回 true。 e. 返回假值。
  7. 如果 Type(x) 是字符串,则 一个。如果 x 和 y 是完全相同的代码单元序列(长度相同 和相应索引处的相同代码单元)返回 true; 否则,返回 false。
  8. 如果 Type(x) 是布尔值,则 一个。如果 x 和 y 都为真或均为假,则返回 true;否则 返回假。
  9. 如果 Type(x) 是符号,则 一个。如果 x 和 y 都是相同的符号值,则返回 true;否则 返回假。
  10. 如果 x 和 y 是相同的对象值,则返回 true。否则,返回 false。

您可以看到,步骤 6 是当 x 和 y 都是数字时发挥作用的步骤。 此外,您可以看到,对于字符串,比较是看到 x 和 y 包含相同的字符,而不是它们确实是相同的字符串对象。

好吧,基元值不是对象(根据定义)。因此,它们没有标识,并且不是单例对象。它们只是不可变的值。由于JavaScript不是一种以内存为中心的语言,并且不允许引用(指针?)原始值,因此无法区分它们。