JavaScript中的Array.prototype.slice.call()方法学习
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()方法学习相关推荐
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
假如你是一个 JavaScript 开发者,你可能见到过 Array.prototype.slice.apply(arguments) 这样的用法,然后你会问,这么写是什么意思呢? 这个语法其实不难理 ...
- Array.prototype.slice.call()方法详解
在很多时候经常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面讲一下其原理: 1.基本讲解 1.在 ...
- javascript中的array对象属性及方法
Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, e ...
- c++ 数组截取_【学习教程】JavaScript中原生Array数组方法详解
来源 | http://www.fly63.com/article/detial/9692 JS中,数组可以通过阵列构造函数或[]字面量的方式创建.数组是一个特殊的对象,继承自对象原型,但用typeo ...
- JavaScript中原生Array数组方法详解
JS中,数组可以通过阵列构造函数或[]字面量的方式创建.数组是一个特殊的对象,继承自对象原型,但用typeof运算判断时,并没有一个特定的值,仍然返回'对象'.但使用[] instanceof Arr ...
- 深入Array.prototype.slice()方法
"slice"英文是 片 的意思,顾名思义,slice方法是将数组切片,即返回原数组的一部分 slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决 ...
- [转载]Array.prototype.slice.call(arguments,1)原理
Array.prototype.slice.call(arguments,1)该语句涉及两个知识点. arguments是一个关键字,代表当前参数,在javascript中虽然arguments表面上 ...
- 详解Javascript中的Array对象
本文地址:http://luopq.com/2016/04/01/Array-in-Javascript/,转载请注明 在上一篇文章中,我们详细介绍了Object对象.在这一篇文章中,我们来说说Arr ...
- Array.prototype.slice.apply(arguments)和[].slice.apply(arguments)解析
我们知道,函数内部 arguments 是一个类数组对象,不是真正的数组,因此也无法使用数组的各种方法.想详细了解 argument 对象可以前往函数中的 arguments. (function f ...
- Array.prototype.slice.call()如何工作?
本文翻译自:how does Array.prototype.slice.call() work? 我知道它用于使参数成为一个真正的数组,但我不明白使用Array.prototype.slice.ca ...
最新文章
- 轨迹生成--三次样条插值
- 新iPhone全面5G!4种杯型,最便宜只要5500,均内置中国北斗
- c语言中if—else的配对问题
- Python之路---------Python介绍
- 常用于解决放缩问题的基本不等式及其几何直观证明
- SAP License:药店ERP系统如何实施
- 2018软工实践第二次作业
- Python学习-第3课(函数作用域、列表集合字典元祖)
- 各种语言和各种前沿技术的简介和科普
- 一个用于创建JSON接口的网站 http://myjson.com/api
- 学校计算机总帐和明细帐的表格,5教学仪器设备总账和明细账填写模板.doc
- 黑白双色背景图java_黄色背景黑白双色简洁ppt图表
- eregi php 5.2,PHP5.3x不再支持ereg和eregi
- ERP系统之结存功能
- windows默认共享的打开和关闭
- Clickhouse除数为0
- 回传速率和测量带宽及两者之间的联系
- 涉外资(外商)公司股权转让有关问题答疑
- 网络协议分析(3):FTP
- Editor.js 使用
热门文章
- Spring Cloud Zuul网关集成JWT身份验证学习总结
- JavaScript的==和Java的==比较
- Spring整合MyBatis之MapperFactoryBean
- Spring自带的工具类总结
- dns学习笔记03-配置master区域
- 安装 PHP memcached 扩展遇到的3个问题
- mysql主主同步机制+keepalived实现MySQL高可用
- 小白的web优化之路 一、使用redis来缓存信息
- 《Adobe Premiere Pro CC经典教程》——6.2 节目监视器控件
- php基础:变量命名、传值、检测、类型转换、动态变量名