我不知道';我不理解javascript中的array.reverse()

我不知道';我不理解javascript中的array.reverse(),javascript,arrays,reverse,Javascript,Arrays,Reverse,下面的代码将向控制台输出什么?为什么 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

下面的代码将向控制台输出什么?为什么

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));
结果将是: 数组1:length=5 last=j,o,n,e,s 数组2:length=5 last=j,o,n,e,s

这是一个与这个问题一起发布的答案。然而,我不明白这是遵循什么javascript原则或规则


reverse()方法返回对数组本身的引用(在本例中为arr1)。因此,arr2只是对arr1的引用(而不是其副本)。因此,当对arr2执行任何操作时(即调用arr2.push(arr3);),arr1也会受到影响,因为arr1和arr2只是对同一对象的引用

这将执行以下操作:

var arr1 = "john".split(''); //splits into j, o, h, n
var arr2 = arr1.reverse(); // reverses the array to n, h, o, j
var arr3 = "jones".split(''); // splits into j, o, n, e, s
arr2.push(arr3); // adds arr3 to the end of arr2
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(''); //splits into j, o, h, n
var arr2 = arr1.reverse(); // reverses the array to n, h, o, j
var arr3 = "jones".split(''); // splits into j, o, n, e, s
arr2.push(arr3); // adds arr3 to the end of arr2
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(''); //splits into j, o, h, n
var arr2 = arr1.reverse(); // reverses the array to n, h, o, j
var arr3 = "jones".split(''); // splits into j, o, n, e, s
arr2.push(arr3); // adds arr3 to the end of arr2
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(''); //splits into j, o, h, n
var arr2 = arr1.reverse(); // reverses the array to n, h, o, j
var arr3 = "jones".split(''); // splits into j, o, n, e, s
arr2.push(arr3); // adds arr3 to the end of arr2
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('');
arr1现在指向数组['j','o','h','n']

var arr2 = arr1.reverse();
arr1和arr2现在指向同一个数组,即['n','h','o','j']

var arr3 = "jones".split('');
arr3现在指向数组['j','o','n','e','s']

arr2.push(arr3);
arr2和arr1现在都指向数组['n','h','o','j',['j','o','n','e','s']。请注意,arr3的元素没有附加到arr1和arr2所指向的数组中。而是将整个数组作为单个元素添加

console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));

记录arr1的长度,即5('n','h','o','j',以及第二个数组)。slice(-1)获取arr1数组的最后一个元素,它是包含“j”、“o”、“n”、“e”、“s”的数组。最后一行重复了这一点,但使用了arr2,这只是对与arr1相同的数组的另一个引用。

让我们逐行分解它:

var arr1 = "john".split('');
arr1现在指向数组['j','o','h','n']

var arr2 = arr1.reverse();
arr1和arr2现在指向同一个数组,即['n','h','o','j']

var arr3 = "jones".split('');
arr3现在指向数组['j','o','n','e','s']

arr2.push(arr3);
arr2和arr1现在都指向数组['n','h','o','j',['j','o','n','e','s']。请注意,arr3的元素没有附加到arr1和arr2所指向的数组中。而是将整个数组作为单个元素添加

console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));

记录arr1的长度,即5('n','h','o','j',以及第二个数组)。slice(-1)获取arr1数组的最后一个元素,它是包含“j”、“o”、“n”、“e”、“s”的数组。最后一行重复了这一点,但使用了arr2,这只是对与arr1相同的数组的另一个引用。

让我们逐行分解它:

var arr1 = "john".split('');
arr1现在指向数组['j','o','h','n']

var arr2 = arr1.reverse();
arr1和arr2现在指向同一个数组,即['n','h','o','j']

var arr3 = "jones".split('');
arr3现在指向数组['j','o','n','e','s']

arr2.push(arr3);
arr2和arr1现在都指向数组['n','h','o','j',['j','o','n','e','s']。请注意,arr3的元素没有附加到arr1和arr2所指向的数组中。而是将整个数组作为单个元素添加

console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));

记录arr1的长度,即5('n','h','o','j',以及第二个数组)。slice(-1)获取arr1数组的最后一个元素,它是包含“j”、“o”、“n”、“e”、“s”的数组。最后一行重复了这一点,但使用了arr2,这只是对与arr1相同的数组的另一个引用。

让我们逐行分解它:

var arr1 = "john".split('');
arr1现在指向数组['j','o','h','n']

var arr2 = arr1.reverse();
arr1和arr2现在指向同一个数组,即['n','h','o','j']

var arr3 = "jones".split('');
arr3现在指向数组['j','o','n','e','s']

arr2.push(arr3);
arr2和arr1现在都指向数组['n','h','o','j',['j','o','n','e','s']。请注意,arr3的元素没有附加到arr1和arr2所指向的数组中。而是将整个数组作为单个元素添加

console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));

记录arr1的长度,即5('n','h','o','j',以及第二个数组)。slice(-1)获取arr1数组的最后一个元素,它是包含“j”、“o”、“n”、“e”、“s”的数组。最后一行重复了这一点,但使用了arr2,这只是对与arr1相同的数组的另一个引用。

我认为原因是将arr1.reverse()分配给arr2就像将它绑定到它一样。您没有创建arr1的新实例,而是使用相同的数组

所以

相当于

arr1.reverse().push(arr3) 
当你这样看它时,它自然会影响arr1


我可能错了,但我认为这就是正在发生的事情,我认为原因是将arr1.reverse()赋值给arr2就像将它绑定到它一样。您没有创建arr1的新实例,而是使用相同的数组

所以

相当于

arr1.reverse().push(arr3) 
当你这样看它时,它自然会影响arr1


我可能错了,但我认为这就是正在发生的事情,我认为原因是将arr1.reverse()赋值给arr2就像将它绑定到它一样。您没有创建arr1的新实例,而是使用相同的数组

所以

相当于

arr1.reverse().push(arr3) 
当你这样看它时,它自然会影响arr1


我可能错了,但我认为这就是正在发生的事情,我认为原因是将arr1.reverse()赋值给arr2就像将它绑定到它一样。您没有创建arr1的新实例,而是使用相同的数组

所以

相当于

arr1.reverse().push(arr3) 
当你这样看它时,它自然会影响arr1


我可能错了,但我认为这就是正在发生的事情

在这段代码中要注意的一点是第2行

var arr2 = arr1.reverse();
这段代码表示反转存储在内存中的数组[arr1指向该数组],并使arr2也指向同一数组

因此,您最终对arr1所引用的数组有一个又一个引用[arr2]

然后通过这个新引用arr2更新相同的数组

arr2.push(arr3);

因此,在内存中始终存储一个数组,并对同一数组进行两次引用[arr1和arr2]。您可以通过任何引用更新存储在该内存中的值,所有引用都将反映更改,因为它们指向相同的内存。

此代码中需要注意的点是第2行

var arr2 = arr1.reverse();
此代码表示将数组反转为sto