发表于: 2017-03-24 23:02:33

2 1117


小课堂--如何实现数组的深拷贝和浅拷贝

1.背景介绍

用js处理数据的时候经常遇到需要保留原数据的情况,有时把数据赋给新的变量并不能解决问题,                    原因是内存中仅保留一份数据。这时候需要制作一份数据的副本。

只有复杂类型变量(引用类型)存在深拷贝与浅拷贝的问题,而基本类型没有深拷贝的概念。

原生js和jquery,以及很多其他框架和库,都提供了一些拷贝数据副本的方法。

“堆内存”和“栈内存”

               

基本类型变量作为“值”保存于“栈内存”中。
                   引用类型变量作为一个指针保存在栈内存中,指向保存在“堆内存”中的引用类型的值

深拷贝和浅拷贝

  • 浅拷贝:拷贝一个变量的时候,复制了栈内存,没有复制堆内存。
  • 深拷贝:拷贝一个变量的时候,复制了栈内存,同时也复制了堆内存。

2.知识剖析

实现深/浅拷贝的方法

  • var 构造的数组是浅拷贝
  • 能返回新的数组的数组方法一般是深拷贝:.slice() .concat()
  • json对象的转换方法,两次转换:JSON.parse JSON.stringify

3.常见问题

  • 深拷贝的优缺点

4.解决方案

比起浅拷贝,深拷贝复制了原数据的内存,因此占用更多空间
                  如果有性能上的担忧,应该想把发避免对数据进行深拷贝。

深拷贝改变了开辟了新的内存空间,应该避免大量的深拷贝,并结合浏览器的内存回收机制,
               尽快释放内存。

5.编码实战

6.扩展思考

  • js库和框架的扩展方法实现深/浅拷贝

7.参考文献

javascript高级程序设计

http://www.cnblogs.com/yichengbo/archive/2014/07/10/3835882.html

8.更多讨论

如何手写一个拷贝方法,按找需要进行深拷贝/浅拷贝






今日完成:

1 日常任务,回复日报,小课堂,完成。

2 任务7,请求列表,调好了接口,

            location /b/{#这里的/b/确定是这样的格式,表示跨域的b选项,是个名字。
           proxy_pass  http://115.29.203.53:10013/;  #服务器地址,后面的“/”不可省略,仅仅是在这个接口不可省略。nginx.cofig文件要作为一个专项来总结一下。

明日计划:

1 日常任务:回复日报,小课堂上传。

2 任务7接收列表,完成学员管理的控制器部分,有时间做angular的表单验证和懒加载。提交任务6,7。

3 有时间总结post,get方法。

问题:


收获:

清楚了跨域的设置,对controller的使用更熟悉了一些。



返回列表 返回列表
评论

    分享到