开发者社区> 问答> 正文

输出以下代码执行的结果并解释为什么?#前端面试

输出以下代码执行的结果并解释为什么

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)

展开
收起
Bill 2020-05-23 13:52:33 2427 0
1 条回答
写回答
取消 提交回答
  • 领取2折优惠劵,有几率免单哦!http://www.weilai.info/tool/326.html

    以下为个人猜想没有确切的理论依据:

    push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。

    根据MDN的说法理解,push方法应该是根据数组的length来根据参数给数组创建一个下标为length的属性,我们可以做以下测试: image.png

    根据这个测试我们发现,push方法影响了数组的length属性和对应下标的值。

    在对象中加入splice属性方法,和length属性后。这个对象变成一个类数组。


    我们使用题目中的代码时得到了这个结果: image.png 这个时候控制台输出的是一个数组,但是实际上它是一个伪数组,并没有数组的其他属性和方法,我们可以通过这种方法验证: image.png

    所以我认为题目的解释应该是:

    1. 使用第一次push,obj对象的push方法设置 obj[2]=1;obj.length+=1
    2. 使用第二次push,obj对象的push方法设置 obj[3]=2;obj.length+=1
    3. 使用console.log输出的时候,因为obj具有 length 属性和 splice 方法,故将其作为数组进行打印
    4. 打印时因为数组未设置下标为 0 1 处的值,故打印为empty,主动 obj[0] 获取为 undefined 第一第二步还可以具体解释为:因为每次push只传入了一个参数,所以 obj.length 的长度只增加了 1。push方法本身还可以增加更多参数,详见 MDN
    2020-05-24 11:49:10
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Vue.js 在前端服务化上的探索与实践 立即下载
阿里文娱大前端技术实践 立即下载
前端代码是怎样智能生成的 立即下载