我不明白 javascript 中的 array.reverse()

I don't understand this array.reverse() in javascript

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

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));

输出将是: "array 1: length=5 last=j,o,n,e,s" "array 2: length=5 last=j,o,n,e,s"

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

"The reverse() method returns a reference to the array itself (i.e., in this case, arr1). As a result, arr2 is simply a reference to (rather than a copy of) arr1. Therefore, when anything is done to arr2 (i.e., when we invoke arr2.push(arr3);), arr1 will be affected as well since arr1 and arr2 are simply references to the same object."

这会执行以下操作:

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' 和第二个数组)。 arr1.slice(-1) 获取arr1数组的最后一个元素,即包含'j'、'o'、'n'、'e'、[=39的数组=].最后一行重复了这一点,但使用了 arr2,它只是对与 arr1 相同的数组的另一个引用。

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

所以

arr2.push(arr3);

等同于

arr1.reverse().push(arr3) 

当你这样看时,它自然会影响 arr1

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

这段代码中需要注意的一点是第 1 行。 2

var arr2 = arr1.reverse();

此代码表示反转存储在内存中的数组[arr1 指向],并让 arr2 也指向同一个数组。

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

然后您通过这个新引用 arr2 更新同一个数组。

arr2.push(arr3);

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