Open bibi7 opened 5 years ago
var 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: ƒ]
有几个值得注意的地方,首先push,来瞅瞅MDN上push的定义:
push方法将值追加到数组中。 push 方法有意具有通用性。该方法和 call() 或 apply() 一起使用时,可应用在类似数组的对象上。push 方法根据 length 属性来决定从哪里开始插入给定的值。如果 length 不能被转成一个数值,则插入的元素索引为 0,包括 length 不存在时。当 length 不存在时,将会创建它。 唯一的原生类数组(array-like)对象是 Strings,尽管如此,它们并不适用该方法,因为字符串是不可改变的。
push方法将值追加到数组中。
push 方法有意具有通用性。该方法和 call() 或 apply() 一起使用时,可应用在类似数组的对象上。push 方法根据 length 属性来决定从哪里开始插入给定的值。如果 length 不能被转成一个数值,则插入的元素索引为 0,包括 length 不存在时。当 length 不存在时,将会创建它。
call()
apply()
push
length
唯一的原生类数组(array-like)对象是 Strings,尽管如此,它们并不适用该方法,因为字符串是不可改变的。
也就是说,一个正常的push会发生如下过程:
const array = [1, 2, 3] array.push(4)
array.length
回到上文:
obj.push(1) obj.push(2)
push(1)
obj.length
由于对象在进行复制的时候,健名不会区分字符串于数字,测试:
var object = {'1':'z1'} object[1] = 'z2' console.log(object) //{1: "z2"}
所以两次的push赋值分别会覆盖对象原本的两个属性。
另一个点:伪数组 当使用console.log输出的时候,因为obj具有 length 属性和 splice 方法,故将其作为伪数组打印出来,由于下标0和1暂无值,所以为两个empty。最终打印出:
Object(4) [empty × 2, 1, 2, splice: ƒ, push: ƒ]
输出答案为:
有几个值得注意的地方,首先push,来瞅瞅MDN上push的定义:
也就是说,一个正常的push会发生如下过程:
array.length
,得到的结果为3回到上文:
push(1)
,会先获取obj.length
,得到2,则obj[2] = 1,同时返回更新过的length
属性length
属性,则obj[3] = 2由于对象在进行复制的时候,健名不会区分字符串于数字,测试:
所以两次的push赋值分别会覆盖对象原本的两个属性。
另一个点:伪数组 当使用console.log输出的时候,因为obj具有 length 属性和 splice 方法,故将其作为伪数组打印出来,由于下标0和1暂无值,所以为两个empty。最终打印出: