1

查看下划线后在这个小提琴上进行了测试。

arguments当 slice不在原型链上时,这似乎是一种 hack 。

为什么它明显有效时不在原型链上arguments.

var slice = Array.prototype.slice;
function test () {
    return slice.call(arguments,1);
    // return arguments.slice(1)
}
var foo = test(1,2,3,4);
_.each(foo, function(val){
    console.log(val)
});
4

4 回答 4

4
>>> Object.prototype.toString.call(arguments)
<<< "[object Arguments]"
>>> Array.isArray(arguments) //is not an array
<<< false
>>> arguments instanceof Array //does not inherit from the Array prototype either
<<< false

arguments不是 Array 对象,也就是说,它不继承自 Array 原型。但是,它包含类似数组的结构(数字键和length属性),因此Array.prototype.slice可以应用于它。这称为鸭子打字

哦,当然,Array.prototype.slice总是返回一个array,因此它可以用来将类似数组的对象/集合转换为一个新的数组。参考:MDN 数组切片方法 - 类似数组的对象

于 2013-05-02T19:05:06.633 回答
0

arguments 不是“真实”数组。

arguments 对象是所有函数中可用的局部变量;不能再使用作为 Function 属性的参数。

参数对象不是数组。它类似于 Array,但除了长度之外没有任何 Array 属性。例如,它没有 pop 方法。但是,它可以转换为真正的数组。

你可以这样做:

var args = Array.prototype.slice.call(arguments);
于 2013-05-02T19:04:03.927 回答
0

参数不是 Array。这是一个 Arguments 对象。

幸运的是,slice只需要一个类似数组的对象,并且由于 Arguments 具有长度和数字索引属性,因此slice.call(arguments)仍然有效。

一个黑客,但它在任何地方都是安全的。

于 2013-05-02T19:05:06.783 回答
0

参考 MDN:»arguments 对象不是 Array。它类似于 Array,但除了长度之外没有任何 Array 属性。例如,它没有 pop 方法。但是它可以转换为真正的数组:«

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments

为了调用slice,您必须从 Array 原型中获取 slice 函数。

于 2013-05-02T19:08:01.493 回答