经典的 [].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 ) 解释相关推荐

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

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

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

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

  3. js Array.prototype.slice.call(arguments,0) 理解

    Array.prototype.slice.call(arguments,0) 经常会看到这段代码用来处理函数的参数 网上很多复制粘帖说:Array.prototype.slice.call(argu ...

  4. [].slice.call(arguments)模拟实现 Array.of

    最近在读<ES6标准入门>这本书,无意间看到下面这段代码: // Array.of()方法可以用下面的代码模拟实现. function ArrayOf(){return [].slice. ...

  5. JS之函数实际参数转换成数组的方法[].slice.call(arguments)

    实际参数在函数中我们可以使用 arguments 对象获得 (注:形参可通过 arguments.callee 获得),虽然 arguments 对象与数组形似,但仍不是真正意义上的数组. 我们可以通 ...

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

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

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

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

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

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

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

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

最新文章

  1. 在Windows下搭建SVN服务器并且集成到 Eclipse 开发环境中
  2. EOS从入门到精通-设计背景与DPOS算法(文字稿)
  3. VC编写的程序不能在其他机器上运行的解决方案
  4. CDH6.3.2集群安装hue报错: HDFS dependency is missing.
  5. java中arges.length_java中的args.length
  6. 【Boost】boost库中function和bind一起使用的技巧(二)
  7. 通俗易懂,java8 .stream().map().collect()用法
  8. python数据的格式输出_python
  9. Jenkins进阶系列之——07更改Jenkins的主目录
  10. 多选取值_减脂饮食,了解食物GI值
  11. 计算机能力挑战赛_全国高校计算机能力挑战赛(基于tensorflow+python+opencv)!
  12. android平板电脑浏览器,安卓平板用什么浏览器
  13. VMware pro 14
  14. 红酒百科知识(一)_manok_新浪博客
  15. Python 实现三维建模工具(上)
  16. java魔法师_RxJava魔法师
  17. 为什么要做业务全场景的梳理?
  18. 一种基于Android、iOS平台的移动端车牌识别方法,能够在复杂背景下迅速识别多种车牌
  19. codeforces787A-The Monster
  20. Prior to Segment: Foreground Cues for Weakly Annotated Classes in Partially Supervised Inseg

热门文章

  1. C++的get()函数与getline()函数使用详解
  2. getline()详解
  3. 简单学习识谱(六线谱)
  4. 5G技术可能使大量基于SIM卡的IoT设备处于威胁中
  5. SpringBoot HATEOAS用法简介(入门)
  6. AD常用使用快捷键和技巧
  7. 比ping更强大的fping
  8. 登录功能的测试用例设计
  9. about ContentProvider
  10. English words page one