根据我对JavaScript(以及Ruby和Python)的理解,在任何给定时间内,内存中只存在给定原始值的单个实例。例如,如果您实例化一个数字,那么该数字将在内存中创建。重新复制该数字的任何其他变量实际上将引用已创建的内存中的相同数字。这可以通过以下示例来说明:
var x = 5;
var y = 5;
Object.is(x, y);
>>>true
原始价值被称为单身人的现象是什么?
答案 0 :(得分:1)
您的测试存在缺陷。当Object.is()
的两个参数都是数字时,它返回两个参数值的比较。这不是对两个变量是否由相同物理内存表示的测试。
当两个参数都是数字时,您可以阅读here on MDN有关比较的工作原理。您还可以在同一页面上查看填充。
如果您想查看Object.is()
的实际ECMAScript规范,可以阅读here。
在该规范中,Object.is()
使用SameValue(x,y)
,其记录为以下步骤:
19.1.2.10 Object.is(value1,value2)
当使用参数value1和value2调用is函数时 采取以下步骤:
返回SameValue(value1,value2)。
这里是SameValue()
部分:
7.2.9 SameValue(x,y)
内部比较抽象操作SameValue(x,y),其中x和y 是ECMAScript语言值,产生真或假。这样的比较是 执行如下:
- ReturnIfAbrupt(X)。
- ReturnIfAbrupt(Y)。
- 如果Type(x)与Type(y)不同,则返回false。
- 如果Type(x)为Undefined,则返回true。
- 如果Type(x)为Null,则返回true。
- 如果Type(x)是Number,那么 一个。如果x是NaN且y是NaN,则返回true。 湾如果x是+0且y是-0,则返回false。 C。如果x是-0且y是+0,则返回false。 d。如果x与y的Number值相同,则返回true。 即返回false。
- 如果Type(x)是String,那么 一个。如果x和y完全相同的代码单元序列(相同的长度 和相应索引处的相同代码单元)返回true; 否则,返回false。
- 如果Type(x)是布尔值,那么 一个。如果x和y都为true或两者都为false,则返回true;除此以外, 返回假。
- 如果Type(x)是Symbol,那么 一个。如果x和y都是相同的Symbol值,则返回true;除此以外, 返回假。
- 如果x和y是相同的Object值,则返回true。否则,返回false。
醇>
您可以看到步骤6是x和y都是数字时发挥作用的步骤。此外,您可以看到,对于字符串,它是比较看到x和y包含相同的字符,而不是它们确实是相同的字符串对象。
答案 1 :(得分:0)
嗯,primitive values不是对象(根据定义)。因此,它们没有identity,也没有单例对象。它们只是不可改变的价值观。由于JavaScript不是以内存为中心的语言,并且不允许对原始值进行引用(指针?),因此无法区分它们。