js变量赋值的坑

这个坑是本人在一次项目中写页面js实现的时候发现的。

需求

大概描述下,就是完成一个放入与移除的功能,大概长这样:
没什么描述
不知道大家是怎么实现,我是通过设置全局数组变量,来保存未选与已选的数据。
命名为project(未选项目),select_project(已选项目)。

数据是通过ajax异步请求加载进来的,ajax返回的数据命名为data。

其中后端经过各种业务逻辑,最后到前端会有一个逻辑是把data的值,赋值给project,和select_project。

关键点来了,我直接写成

project = data;
select_project = data;

而在后面的逻辑里,我对select_project做了清空数组的操作,发现,咦?!怎么project里的数据也没有了。

后来我想到可能的问题,就查找代码,看是不是哪里写了project=select_project;
发现并没有。

其实懂的同学已经发现问题了,如果这个问题放在java后端,我想本人应该能很快发现问题在哪,本人js只能说一般,所以头疼了一会。

问题

其实这个就涉及到变量赋值,引用传递的问题。js跟java一样,基本类型是数据值传递,引用类型是属于引用传递的。不明白的可以自行百度,网上资料很多,很全面了。

解决

其实发现问题后我脑海里第一个闪过的词是【克隆】,也可能说是【拷贝】。然后发现,浅拷贝还不行,要深拷贝,这点小事情还要用到深拷贝,也有点小题大做了。最后用

project = [].concat(data);
select_project = [].concat(data);

其实很简单,就是创建一个空数组,把data里的数据拷进去,然后使用,这样各自都操作各自的内存空间,也就不会互相影响了。当然这个做法只适用于数组;如果是对象,简单粗暴的就是

str = JSON.stringify(obj) ;
obj2 = JSON.parse(str);
另外的收获,关于数组清空

相信有同学清空数组会用

var arr=[];

来完成,查阅资料后发现,这样做是开辟一个新的内存空间出来,让arr指向它,那么原来的arr所指向的内存,因为js没有垃圾回收机制,导致内存溢出。
(不知道这个理论对不对,欢迎探讨)
所以推荐用

arr.length=0;

完!

第一次写博客,记录下工作遇到的问题,也希望分享对大家有用。

一位工作5年的java后端程序猿……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值