先放结论:[].slice.call(arguments)
能将具有length
属性的对象转成数组。
可能大家在看某些代码的时候会发现有这样的代码,[].slice.call(arguments)这代码是什么意思呢,我捉摸了1晚上,现在分别为大家解析一下
[].slice.call(arguments)
这段代码的意思是能够将具有length属性的arguments转换为数组
下面先拆分一下
- [] 数组,意思是创建一个空的数组对象
- slice() :方法可从已有的数组中返回选定的元素。
- 一般将 call 方法用于强制指定 this 的指向
- arguments 是属于函数内部的变量,其值是函数参数列表,一个类数组对象,是具有长度属性的,却并不是数组,不具备slice()这个方法,那就意味着 arguments.slice()行不通
从上面列表看出了已经区分了4个意思,下面先贴代码
function array() {
var _args = [].slice.call(arguments)// 将具有length属性的对象转换成数组
console.log(_args)
}
array()
/**
* 输出转换后的对象: []
*/
首先定义一个名为array的函数方法,在里面定义一个转换方法,arguments指向当前函数array的作用域,也就是方法内部,这个时候调用函数时是没有传递参数的,所以返回一个空数组,那么如果传递值呢?又是什么样子?
function array() {
var _args = [].slice.call(arguments)// 将具有length属性的对象转换成数组
console.log('输出转换后的对象:', _args)
}
array(5, 6, 7, 8, 9)
/**
* 输出转换后的对象: [ 5, 6, 7, 8, 9 ]
*/
可以看到,我传递的是一个一个参数,为什么却被转换成数组了呢? 大家仔细看:
通过[]创建一个空数组,通过slice方法从已有的数组中返回选定的元素。
然后他通过call()方法强制指定当前函数方法内部变量arguments,返回了函数参数列表,这个时候slice()方法将其解析,因为没有给slice参数start和end,所以直接返回从0到最后一个位置的所有参数,将这些参数内部push到[]这个创建好的空数组中,这样子就返回了一个数组元素!
slice()参数:
以上就是我对[].slice.call(arguments)的个人理解