在下面的代码中,如何将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的值也被添加。
有什么方法可以限制这种情况发生吗?
答案 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值是通过引用传递的,而原语是通过值传递的。
考虑到这一点,现在您知道arr1
和arr2
引用内存中的相同空间,因此当您反转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>