copyWithin的call调用实例——关于this

学习过JS的朋友,如果你想callapplybind方法有更深切的了解,可以看看这篇文章。

废话不多说,我们直接上代码:

[].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结构,即它是一个会自动调整lengthobject。关于,这一点,这里就不在赘述了,你有兴趣可以去看《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}

看到这里你再回头看看最上面那个例子,应该就懂了☺。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值