在将引用设置为其他内容后保持Javascript引用

时间:2015-02-06 17:23:44

标签: javascript arrays object

我有

var myFirstArray = [{letter: 'a'}, {letter: 'b'}, {letter: 'c'}];

我想引用myFirstArray,所以我这样做:

var mySecondArray = myFirstArray;

myFirstArray中的推送,拼接,修改元素将显示在mySecondArray中,但如果我想将该数组重置为其他内容:

myFirstArray = [];

myFirstArray = someOtherData;

我的参考文献丢失了。我理解为什么会这样,但我希望mySecondArray能够随时指出myFirstArray指向的任何内容。最好的方法是什么?

我的解决方法包括:

// Just empty the array and push it:
while (myFirstArray.length) myFirstArray.pop(); 
for (var x in data) myFirstArray.push(x);

// Or put the array in an object:
var viewBag = {};
viewBag.myFirstArray = [...];

var mySecondArray = viewBag.myFirstArray;

我不喜欢这两个选项:(

修改:考虑另一种情况:

function doSomethingToMyArray (theArray) {
  // Say I get new data that will be formatted the way I want it to be
  // Shouldn't I be allowed to do this? 

  var myNewData = [{ letter: 'd' }];
  theArray = myNewData;
}

var myFirstArray = [{letter: 'a'}, {letter: 'b'}, {letter: 'c'}];

doSomethingToMyArray (myFirstArray);

// At this point, myFirstArray will still be a, b, c instead of d

2 个答案:

答案 0 :(得分:1)

为什么不设置myFirstArray只设置mySecondArray?

快速设置变量的一个好建议是这种语法:

var mySecondArray, myFirstArray;

mySecondArray = myFirstArray = ["somevalue"];

在JavaScript中,当你将myFirstArray设置为[],然后将mySecondArray设置为myFirstArray时,它将不会引用第一个变量,但两个变量都将引用相同的实际数组。

答案 1 :(得分:0)

当您将父变量设置为新值时,观察者会丢失并且更改不会应用于该子项。

您需要执行将文件放入数据映射的极其令人讨厌的惯例。

所以,而不是:

var myFirstArray

使用:

$ scope.data = {}; $ scope.data.myFirstArray = blah;

我强烈建议为数据对象提供更智能的名称。

您可能遇到的另一个问题是"点问题",which is explained in this blog post.