编辑:我的问题与您要链接的问题不同。具体来说,它并没有说明JS虚拟机是否可以重用对象。
在Javascript中,是否可以保证连续创建的两个对象(当然不是通过将一个对象分配给另一个对象)具有不同的引用?
请考虑以下代码段:
{# For loop even and odd #}
{% for i in 1..10 %}
{{ i ~ " " ~ cycle(['even', 'odd'], i) }}
{% endfor %}
是否保证let a = {};
let b = {}; // b can be created at any time after a is created
let areEqual = a === b; // comparison can be done at any time after b is created
是areEqual
?某些处理器优化不会使false
重用b
的引用吗?
答案 0 :(得分:5)
是的!三重等于是价值与类型的结合。当您在javascript中比较非原始变量时,您真正要比较的是它们的引用ID。换句话说,在您的示例中,a
永远不会等于b
,也不会经过任何处理器优化。
答案 1 :(得分:3)
根据ECMAScript 2018规范,新创建的对象必须具有不同的基础引用。
使用大括号语法(let x = {}
)创建对象使用对象文字语法创建对象。根据规范(section 12.2.6.7):
ObjectLiteral :{}
- 返回ObjectCreate(%ObjectPrototype%)。
在section 9.1.12中查找ObjectCreate
,我们看到ObjectCreate
实例化了一个新的对象实例:
- 如果internalSlotsList不存在,请将internalSlotsList设置为新的空列表。
- 让obj成为新创建的对象,internalSlotsList中的每个名称都有一个内部插槽。
大多数其他创建对象的常用方法(Object.create()
等)在规范中也使用ObjectCreate
定义,因此它们的行为方式相同。
因此,新创建的对象文字不能在后台共享引用。