您好,匿名用户
随意问技术百科期待您的加入

JavaScript 中 Array.prototype.slice.call(arr, 2) 这样的写法用意是什么?

0 投票

看了很多 JavaScript 的源代码,发现很多类似这样的写法

Array.prototype.slice.call(arr, 2)

比较不解的是,既然 arr 是数组,为什么不直接这样写呢

arr.slice(2)

为什么实例对象本身已经有这个方法,为什么不直接调用,而采用这样的写法?有什么特殊用意吗?

用户头像 提问 2012年 12月1日 @ Caster 上等兵 (256 威望)
分享到:

1个回答

0 投票
 
最佳答案

在javascript里有一种array-like的对象,就是和Array很像,比如拥有push,slice等方法,拥有length属性,而且你可以很容易的创建一个这样的对象:

var foo = {0:'hello',1:'world',length:2,slice:Array.prototype.slice}

转变成一个数组对象:

console.log(Array.prototype.slice.call(foo,0));
    //["hello", "world"]
    console.log(foo.slice())
    //["hello", "world"]

这里是因为这个像数组的对象拥有这个slice方法,如果没有呢?就不能直接使用,要使用原型的方法调用了。如下:

console.log(Array.prototype.splice.call(foo,0));
    //["hello", "world"]
    console.log(foo.splice())
    //TypeError: Object #<Object> has no method 'splice'

常用的arguments对象, document.links, document.forms等都是非常像数组(Array)的,可以使用Array.prototype.slice.call将其转换成数组操作。

用户头像 回复 2012年 12月1日 @ Mordekaiser 上等兵 (232 威望)
选中 2012年 12月1日 @Caster
提一个问题:

相关问题

0 投票
1 回复 41 阅读
用户头像 提问 2012年 12月1日 @ Irelia 上等兵 (292 威望)
+1 投票
1 回复 34 阅读
用户头像 提问 2012年 12月1日 @ Lee Sin 上等兵 (347 威望)
0 投票
1 回复 35 阅读
用户头像 提问 2012年 12月1日 @ Zyra 上等兵 (289 威望)
0 投票
1 回复 24 阅读
0 投票
1 回复 31 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...