【问题标题】:A strange thing with js variablesjs变量的奇怪之处
【发布时间】:2013-03-23 14:19:49
【问题描述】:

为什么这段代码会两次提醒同一件事 (1,2,3,4)??

var arr = [1,2,3];
var new_arr = arr;
new_arr[new_arr.length] = 4;
alert(new_arr);
alert(arr);

【问题讨论】:

  • 第 2 行有线索:new_arrarr
  • 现有的答案告诉你为什么你会看到你的行为。如果你想改变你需要复制数组的行为,this question 有一些有用的答案。

标签: javascript arrays variables var


【解决方案1】:

因为当您更改第二个变量时,您正在操作底层数组,该数组被两个变量引用(代表事物),但它只是 一个 事物,然后显示,两次。

这与reference and value types有关。

【讨论】:

    【解决方案2】:

    在 JavaScript 中,所有值要么是原始值(数字、字符串、布尔值、nullundefined),要么是对对象的引用(其中包括数组、函数等)。

    只有一个数组,两个变量都持有对这个数组的引用。

    如果您想拥有另一个数组,以便您可以独立更改它们,请复制第一个:

    var arr = [1,2,3];
    var new_arr = arr.slice();
    

    【讨论】:

    • 非常感谢!我正在为一个基于浏览器的游戏脚本编写寻路算法,这是唯一导致错误答案的问题)我确实非常了解 C#,但这是我的第一个 javascript 程序 =)
    【解决方案3】:

    JavaScript 中的数组是 reference object

    【讨论】:

      【解决方案4】:

      当你这样做时:

      var arr = [1,2,3];
      var new_arr = arr;
      

      您现在有两个变量指向同一个数据结构。数组的赋值是通过引用进行的,这意味着不会创建数据的副本,两个变量只是指向同一个数组。

      因此,无论您修改哪个变量,您都将更改它们都指向的同一条数据。

      所以,当你这样做时:

      new_arr[new_arr.length] = 4;
      

      数据的单一副本已被修改,两个变量都将报告相同的更改。

      在 javascript 中,如果您想要数据的副本,则必须显式创建副本,并且您还必须知道要创建浅副本(仅复制顶级项目)还是深副本(甚至嵌套在数组中的对象或数组也会被复制)。

      .slice() 方法对数组的浅拷贝非常容易。

      var arr = [1,2,3];
      
      // make a copy of the array
      var new_arr = arr.slice(0);
      
      // modify the copy
      new_arr[new_arr.length] = 4;
      
      alert(arr);        // shows length of 3
      alert(new_arr);    // shows length of 4
      

      【讨论】:

        猜你喜欢
        • 2012-05-08
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 2021-01-08
        相关资源
        最近更新 更多