Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数

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

关键点:

1、Array是构造函数

2、arguments是类数组对象(缺少很多数组的方法)

3、call让一个对象调用另一个对象的方法。你可以使用call()来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)

4、 slice从一个数组中切割,返回新的数组,不修改切割的数组

so,其实本质就是arguments这个对象使用了数组的slice这个方法,得到了参数构成的数组(也可以用apply)。

Array.prototype.slice.call(arguments, [0, arguments.length])

//使用prototype只是因为Array是构造函数Array.prototype.slice.call([1,2,3,4,5],0)//  [1, 2, 3, 4, 5][].slice.call([1,2,3,4,5],1)// [2, 3, 4, 5]//没有length的对象var a={length:2, 0:'first', 1:'second'};
Array.prototype.slice.call(a);//  ["first", "second"]var a={length:2, 0:'first', 1:'second'};
Array.prototype.slice.call(a,1);//  ["second"]var a={0:'first', 1:'second'};
Array.prototype.slice.call(a,1);//  []

slice大致内部实现

Array.prototype.slice = function(start,end){var result = newArray();start = start || 0;end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键for(var i = start; i < end; i++){result.push(this[i]);}return result;
}

转成数组的通用函数

var toArray = function(s){try{returnArray.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]; //console.timeEnd测试以后比push快}return arr;}
}

转载于:https://www.cnblogs.com/ysk123/p/9997932.html

js Array.prototype.slice.call(arguments,0) 理解相关推荐

  1. Array.prototype.slice.call(arguments,0); 上下调用模型

    var fn9 = (function () {var arr = {}; //缓存对象var counter = function (arr) { //计算函数//args也就是fn9(1, 2, ...

  2. [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)

    假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...

  3. Array.prototype.slice.call(arguments)

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

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

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

  5. Array.prototype.slice.apply(arguments)和[].slice.apply(arguments)解析

    我们知道,函数内部 arguments 是一个类数组对象,不是真正的数组,因此也无法使用数组的各种方法.想详细了解 argument 对象可以前往函数中的 arguments. (function f ...

  6. [转载]Array.prototype.slice.call(arguments,1)原理

    Array.prototype.slice.call(arguments,1)该语句涉及两个知识点. arguments是一个关键字,代表当前参数,在javascript中虽然arguments表面上 ...

  7. Array.prototype.slice.call(arguments)对象转成数组

    转成数组的通用函数 1 var toArray = function(s){ 2 try{ 3 return Array.prototype.slice.call(s); 4 } catch(e){ ...

  8. Array.prototype.slice.call()方法详解

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

  9. Array.prototype.slice.call

    Array.prototype.slice.call(arguments,0)就类似于arguments.slice(0),但因为arguments不是真正的Array,所以它没有slice这个方法. ...

最新文章

  1. 利用U盘进行软件加密(转)
  2. java io 结构_java 的IO类库的基本架构
  3. vue - 插槽slot
  4. C语言试题二十一之定义n×n的二维数组编写函数 function(int a[][n])功能是:使数组左下半三角元素中的值全部置成0。
  5. 使用Spring Security和OAuth 2.0保护Spring微服务架构
  6. 专利计算机存储介质是智力活动,涉及计算机程序的发明专利申请的相关问题PPT课件.pptx...
  7. 水星怎么设置网速最快_水星无线路由器如何设置网速限制 水星路由器怎么让别人网速限制方法...
  8. 格兰杰因果关系检验r语言_R语言 t检验t.test
  9. 中台架构与实现:基于ddd和微服务 下载_为什么在做微服务设计的时候需要DDD?...
  10. Centos6.7 64位安装配置kvm虚拟化
  11. 安装SQL Server 2016
  12. matlab2016b安装
  13. Springboot结合Redis实现分布式定时任务
  14. 更新python pip 时提示操作超时错误
  15. applet 打印的属性和配置
  16. 4K高清屏幕保护工具Aquarium 4K for Mac
  17. 陈年咖啡豆是什么?陈年咖啡能喝吗?陈年咖啡有什么特别的?
  18. 显示性能指标的计算机术语是,下列计算机术语中,属于显示器性能指标的是()...
  19. 西门子real是什么数据类型_西门子数据类型REAL转WORD和S5TIME的方法
  20. 计算机组成原理---指令系统

热门文章

  1. 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(下)
  2. jscript错误代码及相应解释大全
  3. dos下实现延迟功能
  4. 如何选择 Git 分支模式?
  5. 无责任书评:每个Java程序员都应该深入理解Java虚拟机!
  6. 聊聊引用和 ThreadLocal 那些事儿
  7. 理解分布式系统中的缓存架构(上)
  8. 2020 蓝桥杯大学 B 组省赛模拟赛(一) C. 结果填空:七巧板
  9. html5+css3网页制作:三栏布局宽度自适应,css三栏布局的五种写法,中间自适应,左右宽度固定...
  10. useradd -g mysql mysql_Linux —— useradd -g mysql mysql解析及useradd详解