这个坑是本人在一次项目中写页面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后端程序猿……