05_认识arguments
认识 arguments
什么是 arguments
arguments
是一个对应于传递给函数的参数的类数组对象。(MDN)
类数组对象,就说明它本质上是一个对象类型
类数组表示它长得像数组,并且拥有数组的一些特性,比如说 length,可以通过 index 访问
但是却没有数组的一些方法,比如说 forEach,map 等
function foo() { |
arguments 转成数组
如果我们需要遍历里面的参数呢?或者说使用一些数组的方法呢?
所以在开发中,我们经常会把 arguments 转成数组
第一种方法: 自己遍历
function foo() { |
第二种方法:Array.prototype.slice
function foo() { |
Array.prototype.slice.call(arguments) ?什么意思呀?
首先,我们一般使用 slice 的时候,是 arr.slice(start, end)
,那如果没有这个arr呢?我们怎么才能拿到 slice 这个方法
是不是可以在 Array 的原型上面找这个方法,所以 Array.prototype.slice()
那为什么要用 call 来调用?
我们先来模拟一下 Array 中的 slice 是怎么实现的
Array.prototype.myslice = function(start, end) { |
所以,我们要使用 call 来显式绑定这个 this,让this指向数组
let newArr = Array.prototype.myslice.call([1,2,3,4,5,6]) |
那跟我们 arguments 有什么关系?
Array内部 slice 的实现只不过是对 this,也就是需要使用 slice 的数组进行遍历,然后把需要的部分加入到新数组
那遍历 arguments 也可以啊,把元素一个个加入到一个数组里面,再把这个数组返回,最后不就实现了 arguments 转数组了吗
function foo() { |
再看回这个,应该理解了吧
Array.from (ES6)
Array.from() 方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例(MDN)
function foo() { |
展开运算符 (ES6)
function foo() { |
箭头函数没有 arguments
箭头函数是不绑定 arguments 的,如果在箭头函数中使用 arguments,会去找上层作用域中的arguments
注意,全局作用域是没有 arguments 的
var foo = () => { |
function foo() { |
那如果想传递多个参数呢?用 ES6 的剩余参数
var foo = (a, b, ...args) => { |