Array.prototype.slice.call()的典型应用

目录

作用

  一句话来讲,这是一种将类数组对象转换为真正数组的方法
很多时候我们会遇到“类数组对象”,比如在操作DOM元素的时候,查询符合某种class的DOM节点会返回一个NodeList,它就是一个类数组对象。真正数组的很多成员方法不能直接用于类数组对象,因此就需要将其转换为真正的数组。


示例

1
2
3
4
5
6
7
8
9
Function.prototype.bind = function(context){  
var args = Array.prototype.slice.call(arguments, 1),
self = this;
return function(){
var innerArgs = Array.prototype.slice.call(arguments);
var finalArgs = args.concat(innerArgs);
return self.apply(context,finalArgs);
};
};

该例子是手动实现了一个具有基本功能的bind函数。这里不需要过多关注其细节(具体细节可参考这篇:JavaScript的call()、apply()、bind()方法对比总结),只需要关注:

1
2
3
4
//...
var args = Array.prototype.slice.call(arguments, 1),
//...
var innerArgs = Array.prototype.slice.call(arguments);

这两句即可。
解释

  1. call的作用是在指定的一个作用域上执行某函数。
  2. arguments是javascript中函数的一个默认具有的属性,即参数列表,是一个类数组对象,此处需要将其转换为真正数组。
  3. slice()方法作用域获取数组某个片段。并且它是数组的内置方法,那么必然在Array.prototype上。
  4. 至于call()函数传入的第二个参数,表明的是保留arguments的哪一部分,视具体需求而定。
  5. 调用slice()方法后返回的是一个副本,而原arguments并没有发生变化。

注意事项

  1. 这种将类数组对象转换为真正数组的方法已经从ES6开始正式废止。取而代之的应该使用新提供的方法:Array.from()来达到同样的效果。