Javascript-值赋值更新父元素?

Javascript-值赋值更新父元素?,javascript,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("a

在下面的代码中,如何在将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的值

有没有办法阻止这种情况发生?

此代码:

arr1.reverse()
…反转
arr1
并返回
arr1
,然后将其分配给
arr2
作为参考:

var arr2 = arr1.reverse();
您需要的是
arr1
的副本,可以通过调用其
slice()
方法来获取:

var arr1=“john”拆分(“”);
var arr2=arr1.slice().reverse();
var arr3=“jones”。拆分(“”);
arr2.推送(arr3);
console.log(“数组1:length=“+arr1.length+”last=“+arr1.slice(-1));
console.log(“数组2:length=“+arr2.length+”last=“+arr2.slice(-1))此代码:

arr1.reverse()
…反转
arr1
并返回
arr1
,然后将其分配给
arr2
作为参考:

var arr2 = arr1.reverse();
您需要的是
arr1
的副本,可以通过调用其
slice()
方法来获取:

var arr1=“john”拆分(“”);
var arr2=arr1.slice().reverse();
var arr3=“jones”。拆分(“”);
arr2.推送(arr3);
console.log(“数组1:length=“+arr1.length+”last=“+arr1.slice(-1));
console.log(“数组2:length=“+arr2.length+”last=“+arr2.slice(-1))
reverse()
在调用它的数组上工作

var arr2 = arr1.reverse();
arr2
这里指的是
arr1
反转后的
arr1

reverse()
在调用它的数组上工作

var arr2 = arr1.reverse();

arr2
这里指的是
arr1
反转后的
arr1

如果数组引用对象,也可以通过字符串化arr1克隆数组,然后对其进行解析
var arr1=“john”拆分(“”);
var arr2=JSON.parse(JSON.stringify(arr1)).reverse();
var arr3=“jones”。拆分(“”);
arr2.推送(arr3);
警报(“数组1:length=“+arr1.length+”last=“+arr1.slice(-1));
警报(“数组2:length=“+arr2.length+”last=“+arr2.slice(-1))

如果数组引用了对象,也可以通过字符串化arr1来克隆数组,然后对其进行解析
var arr1=“john”拆分(“”);
var arr2=JSON.parse(JSON.stringify(arr1)).reverse();
var arr3=“jones”。拆分(“”);
arr2.推送(arr3);
警报(“数组1:length=“+arr1.length+”last=“+arr1.slice(-1));
警报(“数组2:length=“+arr2.length+”last=“+arr2.slice(-1))

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

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

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


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

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

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

Array.prototype.reverse()不创建新数组。相反,它将替换现有的图元:

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

资料来源:

下面是一个简单的例子:

var arr = "Hello".split('');   // ["H", "e", "l", "l", "o"] 
arr.reverse();                 // ["o", "l", "l", "e", "H"]
console.log(arr);              // ["o", "l", "l", "e", "H"]
Array.prototype.reverse()不创建新数组。相反,它将替换现有的图元:

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

资料来源:

下面是一个简单的例子:

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

我也得到了相同的输出,没有反向。这是正确的,因为
var arr2=arr1
将通过引用
arr2
来分配
arr1
。因此,您对
arr2
所做的任何操作也将影响
arr1
(除非您明确地将
arr2
设置为等于其他内容)。使用
slice()。因此,您对
arr2
所做的任何操作也将影响
arr1
(除非您明确地将
arr2
设置为等于其他内容)。使用
slice()
将为您提供一个副本而不是引用。在代码编辑中,调用arr1===arr2将返回true。这说明两个变量都指向同一个数组。因此,如果您更改了arr2,那么arr1当然也会更改。带arr2.push(arr3);您正在更改arr2,它指向与arr1相同的数组。在代码编辑中,调用arr1===arr2将返回true。这说明两个变量都指向同一个数组。因此,如果您更改了arr2,那么arr1当然也会更改。带arr2.push(arr3);您正在更改arr2,它指向与arr1相同的数组。