关于Array.prototype.push.call() 和 Array.prototype.slice.call()两种方法,你get了吗

前言

今天在一技术群突然看到有关原型链继承的问题,瞅了下截图,发现看不懂,百度+实验后,决定还是记录下来避免日后遗忘,理解可能有点粗糙,有错误的话,欢迎各位小伙伴指正。

正文

如下图所示,对象a本来是只有一个length属性的,但是调用[].push.call(a,3)函数之后,a对象有所变化,增加了一个属性10,且值为3。看起来时增加了一个属性,但增加属性key为什么是10呢。
这里写图片描述
嗯,看着有点点头疼的样子,于是试着多打印几组数据:
这里写图片描述
可以看到,上图中,当原obj对象中没有length属性时,当我们在obj上调用数组的push方法,obj在添加新属性的同时,更具有了lenghth属性,相当于对象已经变成了一个类数组。这时候新添加的属性的索引为0,这样看起来没有问题,原来为空对象,新增一个属性,索引值自然就变成了0,length=1.
这里写图片描述
这里写图片描述
再次对比了上面所有的试验效果,我们可以明显看到,length属性的值应该是这样来的:
(1)当obj对象中不含有length属性时,通过在obj对象上调用数组原型方法push,将对象转为类数组对象后,length则代表的是新增的属性个数(也可以粗略理解为数组增加的成员)
(2)当对象中含有length属性时,新增属性的索引命名是根据length来的,正如上面b中length为7,新增加的索引为7(可以这样理解,假设已经有7个个了,故新增的那个下标自然为7)

另外,关于Array.prototype.slice.call()方法是只能在类数组上起作用的,并不能同push()方法一样可以可以使对象转换为带有length属性的类数组对象。证明请看下图,对象上直接调用数组的slice()函数是不起作用滴,但是看最后,当对类数组对象调用时就实现我们想要的效果了。
这里写图片描述
这里写图片描述
!!!然后在验证过程中发现了另一个现象,通过上一步打印输出的a对象都还是{0:”banana”,1:”apple”},但调用数组push()方法后,现在的a:{0:”twobanana”,1:”apple”,length:1}。结合之前我们得出的结论,当对象中没有length属性时,默认添加的新属性索引应为0,因为a中已经有为0的key了,于是将原来的banana覆盖了,便有了现在的结果。

补充:
类数组的概念:
(1)拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解);
(2)不具有数组所具有的方法,,不能直接使用上面的方法,但是可以间接通过call方法改变this指针(即宿主对象),从而使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值