目录
作用
一句话来讲,这是一种将类数组对象转换为真正数组的方法。
很多时候我们会遇到“类数组对象”,比如在操作DOM元素的时候,查询符合某种class的DOM节点会返回一个NodeList,它就是一个类数组对象。真正数组的很多成员方法不能直接用于类数组对象,因此就需要将其转换为真正的数组。
示例
1 | Function.prototype.bind = function(context){ |
该例子是手动实现了一个具有基本功能的bind函数。这里不需要过多关注其细节(具体细节可参考这篇:JavaScript的call()、apply()、bind()方法对比总结),只需要关注:1
2
3
4//...
var args = Array.prototype.slice.call(arguments, 1),
//...
var innerArgs = Array.prototype.slice.call(arguments);
这两句即可。
解释
- call的作用是在指定的一个作用域上执行某函数。
- arguments是javascript中函数的一个默认具有的属性,即参数列表,是一个类数组对象,此处需要将其转换为真正数组。
- slice()方法作用域获取数组某个片段。并且它是数组的内置方法,那么必然在Array.prototype上。
- 至于call()函数传入的第二个参数,表明的是保留arguments的哪一部分,视具体需求而定。
- 调用slice()方法后返回的是一个副本,而原arguments并没有发生变化。
注意事项
- 这种将类数组对象转换为真正数组的方法已经从ES6开始正式废止。取而代之的应该使用新提供的方法:
Array.from()
来达到同样的效果。