在很多时候经常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面讲一下其原理:

1、基本讲解

  • 1.在JS里Array是一个类 slice是此类里的一个方法 ,那么使用此方法应该Array.prototype.slice这么去用 
    slice从字面上的意思很容易理解就是截取(当然你不是英肓的话) 这方法如何使用呢? 
    arrayObj.slice(start, [end]) 很显然是截取数组的一部分。

  • 2.我们再看call

 call([thisObj[,arg1[arg2[[argN]]]]]) 

thisObj是一个对象的方法 
arrg1~argN是参数

那么Array.prototype.slice.call(arguments,1);这句话的意思就是说把调用方法的参数截取出来。 
如:

 function test(a,b,c,d) { var arg = Array.prototype.slice.call(arguments,1); alert(arg); } test("a","b","c","d"); //b,c,d

2、疑惑解答

先给个例子,这是jqFloat插件里的代码:

if (element.data('jDefined')) {if (options && typeof options === 'object') { methods.update.apply(this, Array.prototype.slice.call(arguments, 1)); } } else { methods.init.apply(this, Array.prototype.slice.call(arguments, 1)); }

多次用到 Array.prototype.slice.call(arguments, 1),不就是等于 arguments.slice(1) 吗?像前者那样写具体的好处是什么?这个很多js新手最疑惑的地方。那为什么呢?

因为arguments并不是真正的数组对象,只是与数组类似而已,所以它并没有slice这个方法,而Array.prototype.slice.call(arguments, 1)可以理解成是让arguments转换成一个数组对象,让arguments具有slice()方法。要是直接写arguments.slice(1)会报错。

typeof arguments==="Object" //而不是 "Array"

3、真正原理

Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与com对象不能进行转换) 
如:

var a={length:2,0:'first',1:'second'};//类数组,有length属性,长度为2,第0个是first,第1个是second console.log(Array.prototype.slice.call(a,0));// ["first", "second"],调用数组的slice(0); var a={length:2,0:'first',1:'second'}; console.log(Array.prototype.slice.call(a,1));//["second"],调用数组的slice(1); var a={0:'first',1:'second'};//去掉length属性,返回一个空数组 console.log(Array.prototype.slice.call(a,0));//[] function test(){ console.log(Array.prototype.slice.call(arguments,0));//["a", "b", "c"],slice(0) console.log(Array.prototype.slice.call(arguments,1));//["b", "c"],slice(1) } test("a","b","c");

补充: 
将函数的实际参数转换成数组的方法

方法一:var args = Array.prototype.slice.call(arguments);

方法二:var args = [].slice.call(arguments, 0);

方法三:

var args = [];
for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); }

最后,附个转成数组的通用函数

var toArray = function(s){try{ return Array.prototype.slice.call(s); } catch(e){ var arr = []; for(var i = 0,len = s.length; i < len; i++){ //arr.push(s[i]); arr[i] = s[i]; //据说这样比push快 } return arr; } }

版权声明:本文为小平果原创文章,转载请注明:http://blog.csdn.net/i10630226

转载于:https://www.cnblogs.com/duyingxuan/p/6084238.html

Array.prototype.slice.call()方法详解相关推荐

  1. TIA博途中数组Array的基本使用方法详解

    TIA博途中数组Array的基本使用方法详解 ARRAY类型是由数目固定且数据类型相同的元素组成的数据结构. ARRAY类型的定义和使用需要注意以下几点: • ARRAY类型可以在DB.OB/FC/F ...

  2. 详解 Array.prototype.slice.call(arguments)

    首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组 在这里我们看第二个方法 1.在JS里Array是一个类 slice是 ...

  3. c++ 数组截取_【学习教程】JavaScript中原生Array数组方法详解

    来源 | http://www.fly63.com/article/detial/9692 JS中,数组可以通过阵列构造函数或[]字面量的方式创建.数组是一个特殊的对象,继承自对象原型,但用typeo ...

  4. JavaScript中原生Array数组方法详解

    JS中,数组可以通过阵列构造函数或[]字面量的方式创建.数组是一个特殊的对象,继承自对象原型,但用typeof运算判断时,并没有一个特定的值,仍然返回'对象'.但使用[] instanceof Arr ...

  5. 深入Array.prototype.slice()方法

    "slice"英文是 片 的意思,顾名思义,slice方法是将数组切片,即返回原数组的一部分 slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决 ...

  6. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

  7. Js中apply方法详解说明

    Js apply 方法 详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了, ...

  8. Js apply 方法 详解

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  9. Js apply方法详解

    Js apply方法详解 主要解决一下几个问题: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 首先从 ...

最新文章

  1. Spring Session - Cookie VS Session VS Token 以及 Session不一致问题的N种解决方案
  2. 测试Spring的“会话”范围
  3. mysql5.7导出数据_mysql5.7导出数据时出现--secure-file-priv选项应对方法
  4. 数据挖掘之自然语言处理
  5. [17] 楼梯(Stairs)图形的生成算法
  6. python语言中函数在调用前必须先定义吗_应该在python中使用函数之前进行定义?...
  7. windows jdk8
  8. 如何解决More than one file was found with OS independent path 'META-INF/proguard/androidx-annotations
  9. android打开wav声音
  10. python遍历列表中所有元素_python如何遍历列表所有元素?
  11. 苹果手机各种型号图片_八款iPhone详细规格参数对比 你会买哪款?
  12. 柴静《看见》读书笔记
  13. python显示灰度图像,Python读取图像并显示灰度图的实现
  14. 拖住对手?有赞刚收费,点点客就推同类免费产品
  15. java快捷键格式化_在Java中Format的快捷键是什么?
  16. 我的世界刷猪人塔java版_我的世界猪人塔怎么做 5款猪人塔详解教程
  17. 总线宽度为32bit,时钟频率为200MHz,若总线上每5个时钟周期传送一个32bit的字,则该总线的带宽为 (4) MB/S。...
  18. 【已解决】CSDN无法粘贴图片、截图 或者 上传图片一直显示失败
  19. 海龟交易法则11_历史测试的谎言
  20. 华为软件迁移实践微认证题库

热门文章

  1. windows vbs显示桌面命令
  2. Linux学习-X Server 配置文件解析与设定
  3. Android 实现手写板技术
  4. js原生事件委托的实现
  5. python thrift 进行filter
  6. cmd进入控制Mysql出现乱码的问题
  7. 诗与远方-:无题(六十九)
  8. springMVC小记
  9. html语言中%3c%%%3e中语言,[工学]C语言程序设计习题解答.doc
  10. 阿里云服务器(windows2012)