IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 有关 Array.prototype.slice.call() 和 Array.prototype.slice.apply() 方法的详解 -> 正文阅读

[JavaScript知识库]有关 Array.prototype.slice.call() 和 Array.prototype.slice.apply() 方法的详解

对 Array.prototype.slice.call() 和 Array.prototype.slice.apply() 的简要理解

1. 逐步拆分解析

  • slice:可从已有的数组中返回选定的元素,不改变原数组。
    注:有关 splice 方法的详解可参考 有关 Array.prototype.slice() 方法的详解
  • ArrayArrayjavascript 的一个引用类型,Array.prototype 属性表示 Array 构造函数的原型,其上有一个方法叫 slice()
    注:因此, Array.prototype.slice.call(arguments, 1) 也可以写成 [].slice.call(arguments, 1)
  • call 和 apply : 可以简单理解为用来改变对象中函数内部的 this 引用指向apply()call() 方法的第一个参数都是特定的作用域,用来替换对象函数中的 this;第二个参数都是要传递给对象函数的参数,不同之处是 apply() 的第二个参数可以是数组实例arguments 类数组对象call() 则需要逐个列出需要传递的参数

2. 原理(此处以 call 为例说明)

??Array.prototype.slice.call(arguments, number) 的原理为:首先第一个参数 arguments 改变数组的 slice() 方法的作用域(即 this 的指向),使 this 指向 arguments 对象,然后 call() 方法的第二个参数 number 作为传递给 slice() 的参数(截取数组的起始位置)。

??进行上述操作后, arguments 类数组(伪数组)就可以使用数组的方法 slice() 了(伪数组并不是真正的数组,是不可以使用 Array 的相关方法的)。

总结起来可简单理解为: Array.prototype.slice.call(arguments, number) 能够将具有 length 属性(必须包含 length 属性)的对象转换为数组,其意义就在于它能将函数的参数对象转化为一个真正的数组。

3. 示例

arguments 形式

	function test(m, n, p, q) { 
	      var arg = Array.prototype.slice.call(arguments, 1); 
	      // var arg = [].slice.call(arguments, 1); 
	      
	      // apply() 与 call() 是一样的,区别只是传参的形式(即第二个参数不同)
	      // 前者需要把传给 slice() 的参数以数组或类数组的形式传入,如下:
	      // var arg = Array.prototype.slice.apply(arguments, [1]); 
	      alert(arg); 
	 } 
	 test("a","b","c","d");	// b,c,d

伪数组形式

	// 有 length 属性,修改成功
	var obj = {0:'hello', 1:'world', length:2};
	console.log(Array.prototype.slice.call(obj, 0));//["hello", "world"]
	
	// 没有 length 属性,修改失败
	var obj = {0:'hello',1:'world'};
	console.log(Array.prototype.slice.call(obj, 0));//[]
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:39:18  更:2021-09-09 11:41:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 21:28:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计