Javascript-值赋值更新父元素?
在下面的代码中,如何在将arr3值分配给arr2之后,也更新arr1Javascript-值赋值更新父元素?,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
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相同的数组。