为什么我不能在Array.isArray上成功使用'call'?

时间:2015-02-01 21:56:08

标签: javascript

所以我过去经常写这样的东西:

Array.prototype.slice.call(arguments);

- 通过Array.prototype.XXX.callObject.prototype.XXX.call([])等各种方法的类似应用。

所以我去尝试了我不知道存在的Array.isArray方法,并自动编写了Array.prototype.isArray.call,当然isArray因为Array.isArray.call([])而失败了在原型上定义。

但后来我稍微不假思索地尝试了false而得到了Array.isArray(thing_to_be_test),让我很困惑。

当我去了普通的第三次尝试时,它的工作正常。无聊的方式(正确的用法)并简单地写了false,但为什么我在之前的尝试中得到{{1}}?我不明白为什么这样做不起作用。

2 个答案:

答案 0 :(得分:4)

因为Array.isArray有一个参数,你没有传递。您只是传递this值,该值未在函数中使用:

Array.isArray.call(null, [])

答案 1 :(得分:1)

.call()期望的第一件事是 context 。因此,您基本上使用数组的上下文调用.isArray(),但undefined值。

改为打电话:

Array.isArray.call( null, [] );

或使其更逼真:

var isarr = Function.prototype.call.bind( Array.isArray, null );

现在您可以将其称为

isarr( [] );

<击>