Javascript -value赋值更新父元素?

时间:2015-11-30 16:41:17

标签: javascript

在下面的代码中,如何将arr3值分配给arr2,它也会更新arr1?

   var arr1 = "john".split('');
    var arr2 = arr1.reverse();
    var arr3 = "jones".split('');
    arr2.push(arr3);
    console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
    console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));

编辑:当我修改下面的代码时,我得到相同的输出

var arr1 = "john".split('');
var arr2 = arr1;
var arr3 = "jones".split('');
arr2.push(arr3);//arr1 updated
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));

当我在行arr2.push(arr3)之后检查arr1的值时,它显示了arr3的值也被添加。

有什么方法可以限制这种情况发生吗?

5 个答案:

答案 0 :(得分:3)

此代码:

arr1.reverse()

...撤销arr1并返回arr1,然后将其分配给arr2作为参考:

var arr2 = arr1.reverse();

您想要的是arr1副本,您可以通过调用slice()方法获取



var arr1 = "john".split('');
var arr2 = arr1.slice().reverse();
var arr3 = "jones".split('');
arr2.push(arr3);
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));




答案 1 :(得分:1)

首先,您必须知道JavaScript中的Object值是通过引用传递的,而原语是通过值传递的。

考虑到这一点,现在您知道arr1arr2引用内存中的相同空间,因此当您反转arr1时,您没有创建新的反向数组,只是反转arr1并将其分配给arr2,因此两个变量都指向相同的反转数组。

现在,如果您想从arr1创建另一个数组,请使用slice()

var arr2 = arr1.slice().reverse();

答案 2 :(得分:1)

Array.prototype.reverse()不会创建新数组。相反,它取代了原有的元素:

  

反向方法将Array对象的元素反转到位。它在执行期间不会创建新的Array对象。   如果数组不连续,则reverse方法在数组中创建填充数组间隙的元素。这些创建的元素中的每一个都具有未定义的值。

来源:https://msdn.microsoft.com/en-us/library/3333858x(v=vs.94).aspx

这是一个简单的例子:

var arr = "Hello".split('');   // ["H", "e", "l", "l", "o"] 
arr.reverse();                 // ["o", "l", "l", "e", "H"]
console.log(arr);              // ["o", "l", "l", "e", "H"]

答案 3 :(得分:0)

reverse()适用于调用它的数组。

var arr2 = arr1.reverse();

arr2此处指arr1被撤消后的arr1

答案 4 :(得分:0)

如果通过stringify arr1对对象进行referance然后解析它,你也可以克隆数组

var arr1 = "john".split('');
    var arr2 = JSON.parse(JSON.stringify( arr1)).reverse();
    var arr3 = "jones".split('');
    arr2.push(arr3);
    alert("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
    alert("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>