学习过JS
的朋友,如果你想对call
、apply
和bind
方法有更深切的了解,可以看看这篇文章。
废话不多说,我们直接上代码:
[].copyWithin.call({length: 5, 3: 1}, 0, 3);
// { 0: 1, 3: 1, length: 5}
copyWithin()
方法会浅拷贝数组的部分元素到同一数组的不同位置,且不改变数组的大小,返回该数组。如果,对这条ES6语法不熟悉的童鞋,可以狠戳这个链接!
上面这条语句通过[].copyWithin
调用Array.prototype.copyWithin
的方法,只不过这个方法的this={length: 5, 3: 1}
。
那么结果为什么是这个样子呢?如果你有这样的疑问,可以继续看下去。
来可以看下下面的例子吧!
var arr = [];
var arrLike = {length: 0};
// 现在先给arr这个数组添加一个元素
arr[0] = 1;
// 这时arr[length] = 1 对吗?答案是肯定的,你可以想成数组会自动帮我们执行这条语句
// 好,下面我们来给arrLike添加一个元素
arrLike[0] = 1; // 此时arrLike={0: 1, length: 0}
arrLike.length++; // 因此,我们需要我们手动执行这条语句,来让arrLike这个对象的length加1
看到这里,有些朋友也许会问,你说的这个我知道,不就是JS中一切都是对象吗,和上面第一个例子有什么关联?别着急,这只是一个铺垫☺。
顺便提一句,你也许不知道,JS中的数组其实是个伪数组,它的真实结构是一个hash-map结构,即它是一个会自动调整length的object。关于,这一点,这里就不在赘述了,你有兴趣可以去看《JavaScript语言精粹》这本书。
好,继续来解读最开始的例子!
// 这个时候我们定义一个通用函数push
function push(element) {
this[this.length] = element;
// 如果this不是数组, length需要我们手动增加
if (!(this instanceof Array)) {
this.length++;
}
}
// 调用的时候需要通过call把this绑定过去
var arr = [];
var arrLike = {length: 0}
push.call(arr, 1);
push.call(arrLike, 1);
console.log(arr); // [1]
console.log(arrLike); // {0: 1, length: 1}
看到这里你再回头看看最上面那个例子,应该就懂了☺。