当前位置: 首页 > news >正文

[].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的第一项

相关文章:

  • thisisunsafe
  • JS正则汇总
  • npm run serve Syntax Error: Error: Node Sass version 7.0.0 is incompatible with ^4.0.0.
  • Argument for ‘--jsx‘ option must be: ‘preserve‘, ‘react-native‘, ‘react‘.
  • React项目中:VS Code中保存自动格式化JavaScript/TypeScript代码
  • 总结:JS中,表达式和语句的区别
  • React中组件和模块,模块化和组件化的理解
  • ES6:类的基本知识
  • 再议:通用功能页面的组件化编码流程
  • React: 样式模块化
  • React:类式组件
  • React: 深入类中this对象的理解
  • React: state和setState理解
  • React: 函数式组件如何使用props
  • VSCode在代码处显示提交记录
  • SegmentFault for Android 3.0 发布
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 5、React组件事件详解
  • bootstrap创建登录注册页面
  • JS题目及答案整理
  • MySQL数据库运维之数据恢复
  • PHP的Ev教程三(Periodic watcher)
  • spring security oauth2 password授权模式
  • 初探 Vue 生命周期和钩子函数
  • 大整数乘法-表格法
  • 力扣(LeetCode)56
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序(1):冒泡排序
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 数组大概知多少
  • 微服务入门【系列视频课程】
  • 微信公众号开发小记——5.python微信红包
  • 写给高年级小学生看的《Bash 指南》
  • 译自由幺半群
  • 用简单代码看卷积组块发展
  • 国内开源镜像站点
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (九)One-Wire总线-DS18B20
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (五)Python 垃圾回收机制
  • (转)关于pipe()的详细解析
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net CF下精确的计时器
  • .net mvc 获取url中controller和action
  • .NET开发者必备的11款免费工具
  • .NET开源快速、强大、免费的电子表格组件
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [100天算法】-目标和(day 79)
  • [Android 13]Input系列--获取触摸窗口
  • [Android Studio 权威教程]断点调试和高级调试
  • [CTF]2022美团CTF WEB WP
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复