因此,前几天我在玩,目的是确切了解批量分配在JavaScript中的工作方式。
首先,我在控制台中尝试了以下示例:
a = b = {}; a.foo = 'bar'; console.log(b.foo);
结果是“栏”显示在警报中。这很公平,a并且b实际上只是同一对象的别名。然后我想,如何使这个例子更简单。
a
b
a = b = 'foo'; a = 'bar'; console.log(b);
那几乎是同一回事,不是吗?好吧,这次返回的结果与我从第一个示例的行为所期望的foo不bar一样。
foo
bar
为什么会这样?
注意: 可以使用以下代码进一步简化此示例:
a = {}; b = a; a.foo = 'bar'; console.log(b.foo); a = 'foo'; b = a; a = 'bar'; console.log(b);
(我怀疑JavaScript对哈希和字符串之类的原语的处理方式与哈希不同。哈希返回一个指针,而“核心”原语返回其自身的副本)
在第一个示例中,您将设置现有对象的属性。在第二个示例中,您正在分配一个全新的对象。
a = b = {};
a并且b现在是指向同一对象的指针。因此,当您这样做时:
a.foo = 'bar';
b.foo从此它也设置a并b指向同一对象。
b.foo
然而!
如果您改为这样做:
a = 'bar';
您是说现在a指向另一个对象。这a对之前指出的没有影响。
在JavaScript中,分配变量和分配属性是2种不同的操作。最好将变量视为指向对象的指针,当您直接将变量分配给变量时,您无需修改任何对象,而只是将变量指向另一个对象。
但是分配一个属性(如a.foo)将修改a指向的对象。当然,这还修改了所有其他指向该对象的引用,这仅仅是因为它们都指向同一对象。
a.foo