JS循环赋值为什么最后结果不对?

var style = { fontsize: 12, left: 0 };
var style_array = new Array();

function tt(){
    ss();
    for(var j=0;j<12;j++){
        console.error(style_array[j].left + " "+ j+" " + style_array[j].fontsize);
    }
}

function ss(){
for (var i = 0; i < 12; i++) {
    style.fontsize = parseInt((Math.random() * 1 + 1) * 12);
    style.left = parseInt(300 * Math.random() * 0.8);
    style_array[i] = style;
  }
  console.log(style_array);
}
tt();

最后输出的都是style[12]的值,说明赋值的时候只保留了最后一个,这是为什么?


刚刚测试一下,发现只要跳出ss()里面的for循环,style_array[]就全部变成了同样的值

var style = { fontsize: 12, left: 0 };
var style_array = new Array();
function ss(){
for (var i = 0; i < 12; i++) {
    style.fontsize = parseInt((Math.random() * 1 + 1) * 12);
    style.left = parseInt(300 * Math.random() * 0.8);
    style_array[i] = style;
    if(i>=1) console.log(style_array[i-1]);
  }
  console.log(style_array);
}
ss();

问题可以简化了,上面的为什么输出的值都一样了?


解决了

var style = { fontsize: 12, left: 0 };
var style_array = new Array();

function ss(){
for (var i = 0; i < 12; i++) {
    style={};//***********重点**************
    style.fontsize = parseInt((Math.random() * 1 + 1) * 12);
    style.left = parseInt(300 * Math.random() * 0.8);
    style_array[i] = style;
  }
  console.log(style_array);
}
ss();
阅读 3.7k
1 个回答

style 一直是一个对象,修改了,存到数组中的也会修改。
因为数组中的数据指向的都是一个内存地址。对象在进行赋值时,深拷贝一下。
var s = JSON.parse(JSON.stringify(style));
在循环中修改 s 对象的值,就 OK 了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏