我一直在从事Web项目,但是在将窗口变量分配给Javascript中的另一个变量时遇到问题。
例如,我有一个生成随机代码的函数:
window.onload=function(){
...
window.c=genCode(); //Gets an array with 4 strings like ['g', 'r', 'p', 'b'] (first letter of colors of the rainbow)
...
}
然后在程序的后面,我有一个测试,该测试将使用变量中的数据,并最小化新变量
var guess=function(){
...
let tempC=window.c;
...
for(let i=0;i<4;i++){
...
tempC[i]='n';
...
}
}
本地变量tempC
被更改,window.c
也被更改。
我的解决方法是只具有一个返回变量的函数。
var retCode=function(){
return window.c;
}
这可行,但是为什么会这样呢?当您将数据分配给变量时,我认为它应该只修改指定的变量,而不是从中获取数据的变量。这只是一个JavaScript怪癖吗?它与window
的工作方式有关系吗?
答案 0 :(得分:0)
数组和对象通过引用在JavaScript中传递。这意味着变量包含对特定数组的引用,而不是数组本身。因此,当您对该数组进行修改时,它们会在其他地方持久存在。
robocopy C:\source1 C:\destination /E /XO
robocopy C:\source2 C:\destination /E /XO
[etc]
如果要获取不会被原始值破坏的数组副本,则需要使用返回新数组的操作。像var arr = [1,2,3,4,5];
function changesArr(t){
t.push(6);
t.push(7);
}
changesArr(arr);
console.log('1 to 7');
console.log(arr);
var newArr = arr;
newArr.push(8);
console.log('1 to 8');
console.log(arr);
slice()
答案 1 :(得分:0)
JavaScript中的数组是通过引用传递的,您可以在此处阅读有关此内容的更多信息:Is JavaScript a pass-by-reference or pass-by-value language?
也就是说,要解决您的特定情况,只需复制数组即可。由于阵列很小,因此您甚至不必担心性能,只需这样做:
let tempC = JSON.parse(JSON.stringify(window.c));
这会将原始数组转换为兼容JSON的字符串,然后再次解析,丢失对原始数组的任何引用。
如果您不喜欢这种方法,仍然可以在这里找到更多信息:Copying of an array of objects to another Array without object reference in javascript(Deep copy)