【问题标题】:Assigning window variable to local variable将窗口变量分配给局部变量
【发布时间】:2019-03-20 01:03:37
【问题描述】:

我一直在做一个 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 的工作方式有关?

【问题讨论】:

  • 这是因为您正在传递数组的引用。如果你不想改变数组,你必须复制它:let tempC = JSON.parse(JSON.stringify(window.c));.. 或者真的,看看这个:stackoverflow.com/questions/9885821/…
  • 一个数组是按引用而不是按值复制的。因此,当您更改 tempC 时,您正在更改 window.c 引用的数组
  • 基本上,JS数组是“按引用”复制的,而不是按值复制的,所以window.ctempC都指向内存中的同一个数组
  • @Randy - 哈哈,不过,Take 很容易,Tiger。
  • @RandyCasburn 我是一名高中程序员。我还是新手,正在学习如何做很多事情。冷静一下。

标签: javascript


【解决方案1】:

数组,在 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)

【讨论】:

    【解决方案2】:

    数组和对象在 JavaScript 中通过引用传递。这意味着该变量包含对特定数组的引用,而不是数组本身。因此,当您对该数组进行修改时,它们会在其他任何地方持续存在。

    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()

    var arr = [1,2,3,4,5];
    
    function changesArr(t){
      t.push(6);
      t.push(7);
    }
    
    var diffArr = arr.slice();
    changesArr(diffArr);
    console.log('1 to 5');
    console.log(arr);
    
    console.log('1 to 7');
    console.log(diffArr);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多