javascript - 将 javascript 变量链接到对象值。

标签 javascript arrays javascript-objects

我在查看 Backbones v1.0.0 源代码时发现了一些有趣的东西。在 Backbone.Events 对象中,“on”方法似乎是链接一个变量到一个对象值:

 on: function(name, callback, context) {
     if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
     this._events || (this._events = {});
     var events = this._events[name] || (this._events[name] = []);
     events.push({callback: callback, context: context, ctx: context || this});
     return this;
},

events”变量设置为“this._events[name]”值,该值可以是现有数组或设置为空数组。奇怪的部分是下一行将一个对象压入这个数组。推送之后,如果您现在检查“this._events[name]”的值,它现在在其数组的末尾有这个新对象。在我看来,这两者本质上是相关的;当您更新一个时,另一个也会更新。

我以前从未遇到过这样的事情,做一个简单的浏览器控制台测试证实了这种行为。你更新一个,另一个也得到更新。它似乎只适用于作为数组的对象值。谁能解释这里发生了什么?我有点困惑?

最佳答案

在那之后 var events = this._events[name] || (this._events[name] = []); 行,events 变量和 this._events[name] 都指向相同的 数组。因为它们都指向同一个数组,所以无论您执行 events.push(...) 还是 this._events[name].push(...)< 都没有关系,它将把一个元素推送到两个东西都指向的一个数组上。

这与此完全相同:

var a = [];            // Create an empty array, reference it from `a`
var b = a;             // Now, `b` and `a` both point to the same array
a.push("foo");         // Put an entry in the array
console.log(a.length); // "1", unsurprisingly
console.log(b.length); // "1", because both `a` and `b` point to the same array

关于javascript - 将 javascript 变量链接到对象值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15708146/

相关文章:

javascript - 如何使用正则表达式对具有样式的对象进行分组?

javascript - 方法在现代浏览器中返回 __proto__ ?如何去除它?

ios - Swift:无法将类型 'String' 的值转换为预期的参数类型 '@noescape (AnyObject) throws -> Bool'

ios - 将 Swift 字符串转换为数组

javascript - 导出 Google Earth Engine 图像集合中的所有图像 (Google Earth Engine API)

javascript - AngularJS 用函数调用数组

javascript - ES5 捆绑的 Polymer 3 组件无法在 Safari 10 中加载

r - 对于内存来说,当需要不断地将向量增长到未知的上限时应该怎么办?

javascript - JS 比较两个对象数组,并排除匹配值的元素到新数组中

javascript - JS : new-state object created; prevent "pop" from affecting old-state object