Javascript 中的链接方法错误

Chaining Methods error in Javascript

我想知道这段简单的代码失败的原因:

var arr = [1, 2, 3];
arr.push(arr[0]).shift();
console.log(arr);

它 returns 在 firebug 控制台 "TypeError: arr.push(...).shift is not a function"

我认为这是因为我调用的 shift() 方法不是在数组上而是在推送的元素上。

是否有更优雅的方法来获得与

相同的结果
var arr = [1, 2, 3];
arr.push(arr[0]);
arr.shift();
console.log(arr);

生产 ?

提前致谢!

来自the MDN

The push() method adds one or more elements to the end of an array and returns the new length of the array.

arr.push(arr[0]) 不是 return 数组,而是一个显然没有 shift 函数的数字。

据我所知,没有简单的表达式将元素推送到数组并 returning 该数组。但在您的情况下,您可以简单地反转操作并执行

arr.push(arr.shift());

I think it happens because I invoke the shift() method not on an array but on the pushed element.

差不多。 push returns 数组的新长度。一个数字显然没有 shift() 方法。

你把它放在两行的方法是最简单的方法。

本质上这个问题是在说,我能以某种方式"elegantly"表达将数组的第一项移动到末尾的概念吗?幸运的是,JS 是一种图灵完备的语言,它允许我们定义函数,所以 "elegant" 答案只是

rotate(arr)

现在只剩下定义rotate了。旋转就是drop结果中的第一个元素addhead元素到最后:

function rotate(arr) { return drop(add(arr, head(arr))); }

现在drop

function drop(arr) { return arr.shift(), arr; }

head当然是

function head(arr) { return arr[0]; }

并且add

function add(arr, elt) { return arr.push(elt), arr; }

另一种方法

我还可以编写一个函数,使用 splicen 个元素从位置 i 移动到位置 j,如下所示:

function move(arr, n, i, j) {
    arr.splice.apply(arr, [j-n+1, 0].concat(arr.splice(i, n)));
    return arr;
}

然后到rotate就是移动一个元素开头结尾:

function rotate(arr) { return move(arr, 1, 0, 999); }