在Javascript中,是否可以保证{}!== {}?

时间:2018-08-21 01:23:21

标签: javascript

编辑:我的问题与您要链接的问题不同。具体来说,它并没有说明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的引用吗?

2 个答案:

答案 0 :(得分:5)

是的!三重等于是价值与类型的结合。当您在javascript中比较非原始变量时,您真正要比较的是它们的引用ID。换句话说,在您的示例中,a永远不会等于b,也不会经过任何处理器优化。

答案 1 :(得分:3)

根据ECMAScript 2018规范,新创建的对象必须具有不同的基础引用。

使用大括号语法(let x = {})创建对象使用对象文字语法创建对象。根据规范(section 12.2.6.7):

  

ObjectLiteral :{}

     
      
  1. 返回ObjectCreate(%ObjectPrototype%)。
  2.   

section 9.1.12中查找ObjectCreate,我们看到ObjectCreate实例化了一个新的对象实例:

  
      
  1. 如果internalSlotsList不存在,请将internalSlotsList设置为新的空列表。
  2.   
  3. 让obj成为新创建的对象,internalSlotsList中的每个名称都有一个内部插槽。
  4.   

大多数其他创建对象的常用方法(Object.create()等)在规范中也使用ObjectCreate定义,因此它们的行为方式相同。

因此,新创建的对象文字不能在后台共享引用。