我不知道';我不理解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