题目描述:写出执行结果,并解释为什么
const obj = {
'2':3,
'3':4,
'length':2,
'splice':Array.prototype.splice,
'push':Array.prototype.push
}
obj.push(1);
obj.push(2);
console.log(obj);
答案:
Object(4) [empty × 2, 1, 2, splice: ƒ, push: ƒ]
/*
2: 1
3: 2
length: 4
splice: ƒ splice()
push: ƒ push()
__proto__: Object
*/
知识点:
类数组(ArrayLike):一组数据,由数组来存储,但是如果要对这组数据进行扩展,会影响到数组原型,ArrayLike 的出现提供了一个中间数据桥梁,ArrayLike 由数组的特性,但是对 ArrayLike 的扩展并不会影响到原生的数组
push 方法:push 方法具有通用性。该方法和 call 或者 apply 一起使用时,可应用在类数组的对象上。push 方法根据 length 属性来决定从哪里开始插入给定的值。如果 length 属性不能被转成要给数值,则插入的元素索引为 0 ,包括 length 不存在时。当 length 属性不存在时,将会创建它。唯一的原生类数组(array like)对象是 String ,尽管如此,他们并不适用该方法,因为字符串是不可改变的。
对象转数组的方式:Array.form(),splice(),concat(),[...array]等
解析:
这个obj中定义了两个 key 值,分别为 splice 和 push。分别对应数组原型中的 splice 和 push 方法,因此这个 obj 可以调用数组中的 push 和 splice 方法
调用对象的 push 方法: push(1),因为此时 obj 中定义的 length 为 2 ,所以从数组索引为 2 的位置开始插入,也就是数组的第三项,因为数组索引是从 0 开始的,这时已定义了下标为 2 和 3 的两项('2':3,'3':4,),所以 push(1) 会替换下标为 2 的一项,push(2) 会替换掉索引下标为 3 的一项。此时 key 为 2 的属性值为 1 ,key 为 3 的属性值为 2 。
此时的输出结果就是:Object(4) [empty × 2, 1, 2, splice: ƒ, push: ƒ]。
因为只是定义了 2 和 3 两项,没有定义 0 和 1 两项,所以前面会是 empty。