javascript - 通过for循环创建对象型数组,为什么数组每一项都是一样的,都是最后一个值
伊谢尔伦
伊谢尔伦 2017-04-11 12:01:56
[JavaScript讨论组]

简单的例子:for循环遍历2个数组,分别添加给对象的2个属性,然后将对象添加到新数组,为什么最后新数组每一项都一样??


var arr=[]
var k={}
k.num=0
k.name=''
a=[1,2,3,4]
b=['tom','sun','bob','kiki']
for(i=0;i<4;i++)
{
    k.num=a[i];
    k.name=b[i];
    arr.push(k)
}
console.log(arr)

结果:[{name:'kiki,num:4},{name:'kiki,num:4},{name:'kiki,num:4},{name:'kiki,num:4}]

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
阿神

k是一个对象,而且在内存中只有一个,循环中每次对k的属性赋值都在相同的内存空间里进行,所以push到arr中的4个对象都是相同的k对象,且因为最后给k属性赋值为

{
    name: 'kiki',
    num: 4
}

所以打印出这个效果。

可以这么改

for(i = 0; i < 4; i++)
{
    arr.push({
        num : a[i],
        name: b[i]
    })
}
大家讲道理

javaScript 的对象是一种引用类型,k 这个对象一直是同一个应用,所以循环里面 push 了四次 k,可以在循环里面改变 k 的引用

for(i=0;i<4;i++)
{
    k = {};         // 让 k 等于一个新的对象
    k.num=a[i];
    k.name=b[i];
    arr.push(k)
}
怪我咯

原因楼上们都说了 对象是应用类型。
我的该法是你原代码不变。arr.push(k)这句话改成
arr.push(JSON.parse(JSON.stringify(k)));

阿神

Object是引用类型,引用类型的值是可变的,每次改变的是栈中k的指向,所以虽然有四个k,但最后指向的都是最后一次堆中的内容。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号