[].shift.call( arguments ) 和 [].slice.call( arguments ) 解释
经典的 [].slice.call( arguments )
关于这个的解释网上有很多,大多是 “把类数组对象转为数组对象”。确实这是我们想要实现的功能! 但这仅仅是说明了结果并没有解答其原理。
来点基础知识:
[].slice.call( arguments )
// 等效于
Array.prototype.slice.call( arguments )
个人理解:
要把arguments
转为数组对象!
本着 能少写就少写,能不写就不写的想法,想到slice():可从已有的数组中返回选定的元素。
slice
不会改变原来的数组,而是返回一个子数组。
let kindle = [1,2,3,4,5,6,7]
console.log(kindle.slice()) // [ 1, 2, 3, 4, 5, 6, 7 ]
那么下一个问题又来了,arguments
不是数组对象,不能调用数组的方法。
arguments
想要转为数组对象,怎么转? for
循环等。。。
但是能少写就少写,能不写就不写
这时候又要解锁一个call
函数,或者 apply
函数。这两个函数都可以改变函数 this
的指向,函数运行时的作用域。区别就是参数不一样,第一个参数都是一个对象或者 ‘this’ 注意this加引号了, apply第二个参数接收一个数组,call则不是,call可以有n个参数有多少放多少就行
call函数详解点击这里
slice
方法原理就是根据传入的参数(值)对原数组(或者类数组)进行遍历获取,赋给新数组然后返回。如果没有参数便复制整个原数组(或者类数组),后赋给新数组然后返回。
重点来了
因为slice
内部实现是使用的this
代表调用对象。那么当[].slice.call()
传入 arguments
对象的时候,通过 call
函数改变原来 slice
方法的this
指向, 使其指向arguments
,并对arguments
进行复制操作,而后返回一个新数组。至此便是完成了arguments
类数组转为数组的目的!
其实这可以理解为,让类数组调用数组的方法!
[].shift.call( arguments )
[].shift.call( arguments )
这便是一个例子。
shift()
方法删除数组第一项,并返回删除项。
根据上边的理解,这句代码意思就是: “删除并拿到arguments
的第一项”
[].shift.call( arguments ) 和 [].slice.call( arguments ) 解释相关推荐
- 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表面上 ...
- js Array.prototype.slice.call(arguments,0) 理解
Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...
- [].slice.call(arguments)模拟实现 Array.of
最近在读<ES6标准入门>这本书,无意间看到下面这段代码: // Array.of()方法可以用下面的代码模拟实现. function ArrayOf(){return [].slice. ...
- JS之函数实际参数转换成数组的方法[].slice.call(arguments)
实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 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是 ...
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- Array.prototype.slice.call(arguments,0); 上下调用模型
var fn9 = (function () {var arr = {}; //缓存对象var counter = function (arr) { //计算函数//args也就是fn9(1, 2, ...
最新文章
- 在Windows下搭建SVN服务器并且集成到 Eclipse 开发环境中
- EOS从入门到精通-设计背景与DPOS算法(文字稿)
- VC编写的程序不能在其他机器上运行的解决方案
- CDH6.3.2集群安装hue报错: HDFS dependency is missing.
- java中arges.length_java中的args.length
- 【Boost】boost库中function和bind一起使用的技巧(二)
- 通俗易懂,java8 .stream().map().collect()用法
- python数据的格式输出_python
- Jenkins进阶系列之——07更改Jenkins的主目录
- 多选取值_减脂饮食,了解食物GI值
- 计算机能力挑战赛_全国高校计算机能力挑战赛(基于tensorflow+python+opencv)!
- android平板电脑浏览器,安卓平板用什么浏览器
- VMware pro 14
- 红酒百科知识(一)_manok_新浪博客
- Python 实现三维建模工具(上)
- java魔法师_RxJava魔法师
- 为什么要做业务全场景的梳理?
- 一种基于Android、iOS平台的移动端车牌识别方法,能够在复杂背景下迅速识别多种车牌
- codeforces787A-The Monster
- Prior to Segment: Foreground Cues for Weakly Annotated Classes in Partially Supervised Inseg