对象赋值 顺便讲讲_.clone(浅拷贝)

最近,我碰到一个令我蛮好奇的事,后来想想其实是我自己没有把知识运用到实际项目中去导致了这个bug,并兜了个大圈。事情的经过如下:

假设后台给的数据:

而需要的数据是:

而这个时候我想也没想就做了这样的处理:

for(var i=0,len=list.length;i<len;i++){
    tableData[i]['value'] = list[i].firstname;
    tableData[i]['id'] = list[i].stuId;
}  

但是很遗憾,控制台报错了,我想难道是在设置tableData[i]的属性的时候没有给它事先声明?然后我就这样做:

var obj = {
    value : "",
    id : ""
}
for(var i=0,len=list.length;i<len;i++){
    tableData1[i] = obj;
    tableData1[i].value = list[i].firstname;
    tableData1[i].id = list[i].stuId;
}   

但是更遗憾的是,得到的tableData1数据可怕到不行,数组内的每一行数据竟然都相同。这时候,我才想起来对象的=赋值是传递堆空间内的地址值,那这?思考了一阵,咦,_.clone好像可以实现浅拷贝,然后我就

for(var i=0,len=list.length;i<len;i++){
    tableData3[i] = _.clone(obj);
    tableData3[i].value = list[i].firstname;
    tableData3[i].id = list[i].stuId;
}

果然成功了诶,得到了我想要的数据。

但是这个时候,我又研究了之前的那个报错问题,我发现其实只是在给tableData[i]赋值的时候没有给它定义成对象,所以它没有属性这个东西,其实只要在给它设置属性值时现将其定义成对象tableData[i] = {}即可,兜兜转转还把问题想复杂了~~

讲讲心得吧:

     虽然最后不是因为对象赋值的原因导致的问题,但是通过这次,我对对象的赋值有了较为清晰的理解。对象的值传递这个其实之前在书本及论坛上都有看到并学习过,但是没有真正理解并运用起来都是虚的。在实际开发中很多时候都会遇到将一个对象赋值给另一个对象的问题,这个时候就不能用=了,underscore的_.clone是一个很好的选择。underscore中是这样解释_.clone的:创建 一个浅复制(浅拷贝)的克隆object。任何嵌套的对象或数组都通过引用拷贝,不会复制。其实underscore还有很多很实用的函数,继续学习与探索。最后,我爱技术,学习永无止境!


猜你喜欢

转载自blog.csdn.net/qq_33201818/article/details/80376447
今日推荐