今日研读阮老师的ES6标准入门,读到函数的扩展方法时看到这么一段代码:
let arrayList = {
"0":"a",
"1":"b",
"2":"c",
"length":3
}
var arr = [].slice.call(arrayList) // ["a","b","c"]
很明显,上面代码转化代码的关键就是[].slice.call()
这一句了。
鄙人不才,平常在项目里碰到需要解构的json数据时都是直接怼上for/forin硬肛的,现在想想真是羞愧啊,往事不提不提~
阮老师的这个demo勾起了我的兴趣,那么我就从call()讲起。
要理解var arr = [].slice.call(arrayList) // ["a","b","c"]
这句代码的意思,你需要有以下三点需要理解:
1. [ ]是什么?
2.slice()函数起到什么作用?
3. call()函数起到什么作用?
先讲第一点。[ ]是什么,J开头的程序员肯定都知道,js里的数组嘛,没什么好说的。值得讲讲的就一点,就是[]与new Array()到底有什么区别?它们到底哪个效率高?[]到底需不需要分配内存?我不做回答,大家可以自行探究。
再讲第二点,slice()函数,我们来看官方MDN定义:
slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。且原始数组不会被修改.
这就很明显了,这就是[]对象(js里函数也是一个对象)调用了一下slice()函数嘛,为啥调用它,因为它返回新的数组对象呀。那么问题又来了,是不是只要会返回新的数组对象的函数都可以在这里调用呢?我们暂且先不谈论,先往下讲。
最后说说第三点,call( )函数。我们来看MDN定义: