Javascript变量跟踪他们的副本?

时间:2013-08-06 09:16:30

标签: javascript variables

我偶然发现了一件奇怪的事情。

我有一个模型类,您可以通过model.get(attributeName)函数获取属性值。

所以我在一个视图中这样做了:

var mapModel = new Ex.Models.MapModel(model);
var view = new Ex.Views.MapView(mapModel);

var d = this.model.get('layerIds');
d.mapLayer = view.getId();

console.log("layerIds", this.model.get('layerIds'));

默认情况下,属性layerIds.mapLayer设置为null。如果我将其设置为视图ID(例如43),我希望console.log仍会返回{mapLayer: null},因为我创建了可变d来复制this.model.get('layerIds') {1}}并使用该值独立于模型值。

但如果我执行这段代码,日志会说:

{mapLayer: 43}

这是为什么?为什么Javascript变量会跟踪其复制的值并在其他一个更改后更新自己的值?

怎么能阻止它?

2 个答案:

答案 0 :(得分:1)

前一行中的get方法返回对模型中layerIds对象的引用:

var d = this.model.get('layerIds');

当设置maplayer上的d属性时,也会操纵引用。基本上dthis.model.get('layerIds')将从内存中返回相同的对象。

d.mapLayer = view.getId();

如果你检查了两者之间的相等,你会发现它们是同一个对象。

d === this.model.get('layerIds') // true

答案 1 :(得分:1)

来自Javascript by reference vs. by value

“Javascript总是按值传递,但是当变量引用对象(包括数组)时,”value“是对象的引用。”

this.model.get('layerIds'); //  returns an object : {mapLayer: null}