JavaScript中的Array.prototype.slice.call(arguments)能将有length属性的对象转换为数组(特别注意: 这个对象一定要有length属性). 但有一个例外,IE下的节点集合它不能转换(因为IE下的dom对象是以com对象的形式实现,js对象和com对象不能进行转换)

首先,我们来看看JavaScript中的slice用法, 在JavaScript中Array是一个类,slice是此类中的一个方法,slice的中文意思是 ‘截取’

一个是String.slice  => 返回值是字符串

一个是Array.slice => 返回值是数组

Array.prototype.slice.call(arguments)能够将具有length属性的arguments转换为数组,  我们可以理解为就是 arguments.toArray().slice()

所以,这个过程我们是不是可以理解为 Array.prototype.slice.call(arguments)的实现过程就是把传入进来的具有length属性的第一个参数arguments转换为数组,再调用它的slice(截取)方法

这个Array.prototype.slice.call(arguments) 不单有slice方法,还有call方法。 那么call方法又是如何用的呢

我们来看一个用call方法的例子:

var a = function(){console.log(this);console.log(typeof this);console.log(this instanceof String);}a.call('littleLuke');
输出如下// 'littleLuke'
//  Object
//  true

以下是上面的代码片段在Visual Studio Code中的执行

从上面的代码片段中,我们可以看到调用了函数a的call方法之后,我们可以看到把call方法中的参数传入到函数a的作用域中去了,也就是说函数a中的this此时指向的就是它调用的call方法中的参数

我们上面说了,Array.Prototype.slice.call()除了call方法外,还有slice方法,那么JavaScript中Array的slice方法的内部实现是怎样的呢

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

所以整个过程我们基本就可以分2步进行理解了

Array.prototype.slice.call(arguments)

理解第一步:  其中,arguments是一个具有length属性的对象, 通过call 这个方法,把arguments 指向了Array.prototype.slice方法的作用域,也就是说通过call方法,让Array.prototype.slice对arguments对象进行操作

理解第二步:  Array.prototype.slice就是对该对象使用Array类的slice方法。但是呢arguments它又不是个Array对象

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

所以我们没法用arguments.slice()方法,这样是会报错的。 所以这里,我们需要使用Array.prototype.slice, 它的作用就是第一步把arguments转换为一个Array对象,第二步对转换后的Array对象使用slice方法

理解了整个过程后,我们来看一些具体的例子,

下面是我自己在Visual Studio Code中执行的截图

在文章的结尾,来说两个在实际开发中比较常用到的通用方法

1. 将函数的实际参数转换成数组的方法 (3个方法)

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

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

方法三:

2. 转换成数组的通用函数

转载于:https://www.cnblogs.com/wphl-27/p/10336591.html

JavaScript中的Array.prototype.slice.call()方法学习相关推荐

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

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

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

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

  3. javascript中的array对象属性及方法

    Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, e ...

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

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

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

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

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

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

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

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

  8. 详解Javascript中的Array对象

    本文地址:http://luopq.com/2016/04/01/Array-in-Javascript/,转载请注明 在上一篇文章中,我们详细介绍了Object对象.在这一篇文章中,我们来说说Arr ...

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

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

  10. Array.prototype.slice.call()如何工作?

    本文翻译自:how does Array.prototype.slice.call() work? 我知道它用于使参数成为一个真正的数组,但我不明白使用Array.prototype.slice.ca ...

最新文章

  1. 轨迹生成--三次样条插值
  2. 新iPhone全面5G!4种杯型,最便宜只要5500,均内置中国北斗
  3. c语言中if—else的配对问题
  4. Python之路---------Python介绍
  5. 常用于解决放缩问题的基本不等式及其几何直观证明
  6. SAP License:药店ERP系统如何实施
  7. 2018软工实践第二次作业
  8. Python学习-第3课(函数作用域、列表集合字典元祖)
  9. 各种语言和各种前沿技术的简介和科普
  10. 一个用于创建JSON接口的网站 http://myjson.com/api
  11. 学校计算机总帐和明细帐的表格,5教学仪器设备总账和明细账填写模板.doc
  12. 黑白双色背景图java_黄色背景黑白双色简洁ppt图表
  13. eregi php 5.2,PHP5.3x不再支持ereg和eregi
  14. ERP系统之结存功能
  15. windows默认共享的打开和关闭
  16. Clickhouse除数为0
  17. 回传速率和测量带宽及两者之间的联系
  18. 涉外资(外商)公司股权转让有关问题答疑
  19. 网络协议分析(3):FTP
  20. Editor.js 使用

热门文章

  1. Spring Cloud Zuul网关集成JWT身份验证学习总结
  2. JavaScript的==和Java的==比较
  3. Spring整合MyBatis之MapperFactoryBean
  4. Spring自带的工具类总结
  5. dns学习笔记03-配置master区域
  6. 安装 PHP memcached 扩展遇到的3个问题
  7. mysql主主同步机制+keepalived实现MySQL高可用
  8. 小白的web优化之路 一、使用redis来缓存信息
  9. 《Adobe Premiere Pro CC经典教程》——6.2 节目监视器控件
  10. php基础:变量命名、传值、检测、类型转换、动态变量名