2015-02-06 94 views
0

保持javascript参考

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 
+0

'myFirstArray.length = 0;'会清除你的两个数组,如果这是所有你需要做的。如果你想完全替换内容,那么:'myFirstArray.length = 0; myFirstArray.push.appy(myFirstArray,someOtherData);'。这些都会影响'mySecondArray',只要你让它引用'myFirstArray'就像你的问题所暗示的那样。 – DRobinson 2015-02-06 17:28:23

+1

Javascript没有变量引用。它只有对象和数组的引用。 – Barmar 2015-02-06 17:29:13

+0

Barmar,ok - 那么你是说当Bar指向一个新的数组/对象时,没有办法将引用Foo保存到数组/对象Bar中? – 2015-02-06 17:41:58

回答

1

,只要你设置为什么不直接设置mySecondArray myFirstArray?

很好的提示快速设置变量是这样的语法:

var mySecondArray, myFirstArray; 

mySecondArray = myFirstArray = ["somevalue"]; 

在JavaScript中,当你设置myFirstArray喜欢的东西[],然后mySecondArray到myFirstArray,也不会引用第一个变量,但两个变量将引用相同的实际数组。

+1

如果你打算一直设置这两个变量,那么有两个变量有什么意义? – Barmar 2015-02-06 17:30:01

+0

的确如此,Greg Pete,你为什么需要两个变量? – TRGWII 2015-02-06 17:32:38

+0

感谢TRGWII,但原因是我使用的是Angular,而父范围拥有myFirstArray,而子范围拥有mySecondArray - 如果可能的话,我想尽量减少这些数组的交叉控制器通信(即使它是通过服务或通过$看)。 mySecondArray必须与myFirstArray相同,但使用不同的名称,因为它是模板(由mySecondArray的控制器控制)正在使用的变量的名称。 – 2015-02-06 17:33:49

0

发生什么事情是,当您将父变量设置为新值时,观察者会丢失,并且更改不会应用于子项。

你需要做这个非常讨厌的将文件放入数据映射中。

因此,而不是:

VAR myFirstArray

用途:

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

我强烈建议给数据对象一个更聪明的名字是可能的。

你可能会遇到的另一个问题是“点问题”,which is explained in this blog post.

+0

谢谢。当我使用Angular时,这更像是一个正常的Javascript问题。看到我对问题的编辑以证明问题。 – 2015-02-06 18:29:10