【发布时间】:2015-05-29 23:35:55
【问题描述】:
下面的代码会向控制台输出什么,为什么?
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:长度=5 最后=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 只是对同一个对象的引用。"
【问题讨论】:
-
表示
reverse是就地算法。 -
var x = [1,2,3]; x.reverse(); console.log(x); // => [3,2,1]请注意,您不必将x.reverse()分配给另一个变量;相反,该操作是在阵列上执行的。相反,.map之类的操作不会像x.map(function (d) { return d * 2; }); console.log(x); // => [3,2,1]那样工作,因为它们不能根据引用工作 -
很难改进这个答案。 Array.prototype.reverse 反转它所调用的数组,然后返回对该数组的引用。所以在 b 是一个数组的地方,
var a = b.reverse()的结果是 b 被反转并且 a 被分配了一个对它的引用,所以两者a 和 b 引用同一个数组。
标签: javascript arrays reverse