js Array.prototype.slice.call(arguments,0) 理解
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) 理解相关推荐
- Array.prototype.slice.call(arguments,0); 上下调用模型
var fn9 = (function () {var arr = {}; //缓存对象var counter = function (arr) { //计算函数//args也就是fn9(1, 2, ...
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- Array.prototype.slice.call(arguments)
Array.prototype.slice.call(arguments)能将具有length属性的对象转成数组,除了IE下的节点集合(因为ie下的dom对象是以com对象的形式实现的,js对象与co ...
- 详解 Array.prototype.slice.call(arguments)
首先,slice有两个用法,一个是String.slice,一个是Array.slice,第一个返回的是字符串,第二个返回的是数组 在这里我们看第二个方法 1.在JS里Array是一个类 slice是 ...
- Array.prototype.slice.apply(arguments)和[].slice.apply(arguments)解析
我们知道,函数内部 arguments 是一个类数组对象,不是真正的数组,因此也无法使用数组的各种方法.想详细了解 argument 对象可以前往函数中的 arguments. (function f ...
- [转载]Array.prototype.slice.call(arguments,1)原理
Array.prototype.slice.call(arguments,1)该语句涉及两个知识点. arguments是一个关键字,代表当前参数,在javascript中虽然arguments表面上 ...
- Array.prototype.slice.call(arguments)对象转成数组
转成数组的通用函数 1 var toArray = function(s){ 2 try{ 3 return Array.prototype.slice.call(s); 4 } catch(e){ ...
- Array.prototype.slice.call()方法详解
在很多时候经常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面讲一下其原理: 1.基本讲解 1.在 ...
- Array.prototype.slice.call
Array.prototype.slice.call(arguments,0)就类似于arguments.slice(0),但因为arguments不是真正的Array,所以它没有slice这个方法. ...
最新文章
- 利用U盘进行软件加密(转)
- java io 结构_java 的IO类库的基本架构
- vue - 插槽slot
- C语言试题二十一之定义n×n的二维数组编写函数 function(int a[][n])功能是:使数组左下半三角元素中的值全部置成0。
- 使用Spring Security和OAuth 2.0保护Spring微服务架构
- 专利计算机存储介质是智力活动,涉及计算机程序的发明专利申请的相关问题PPT课件.pptx...
- 水星怎么设置网速最快_水星无线路由器如何设置网速限制 水星路由器怎么让别人网速限制方法...
- 格兰杰因果关系检验r语言_R语言 t检验t.test
- 中台架构与实现:基于ddd和微服务 下载_为什么在做微服务设计的时候需要DDD?...
- Centos6.7 64位安装配置kvm虚拟化
- 安装SQL Server 2016
- matlab2016b安装
- Springboot结合Redis实现分布式定时任务
- 更新python pip 时提示操作超时错误
- applet 打印的属性和配置
- 4K高清屏幕保护工具Aquarium 4K for Mac
- 陈年咖啡豆是什么?陈年咖啡能喝吗?陈年咖啡有什么特别的?
- 显示性能指标的计算机术语是,下列计算机术语中,属于显示器性能指标的是()...
- 西门子real是什么数据类型_西门子数据类型REAL转WORD和S5TIME的方法
- 计算机组成原理---指令系统
热门文章
- 【iOS-cocos2d-X 游戏开发之十三】cocos2dx通过Jni调用Android的Java层代码(下)
- jscript错误代码及相应解释大全
- dos下实现延迟功能
- 如何选择 Git 分支模式?
- 无责任书评:每个Java程序员都应该深入理解Java虚拟机!
- 聊聊引用和 ThreadLocal 那些事儿
- 理解分布式系统中的缓存架构(上)
- 2020 蓝桥杯大学 B 组省赛模拟赛(一) C. 结果填空:七巧板
- html5+css3网页制作:三栏布局宽度自适应,css三栏布局的五种写法,中间自适应,左右宽度固定...
- useradd -g mysql mysql_Linux —— useradd -g mysql mysql解析及useradd详解