JavaScript 中深拷贝浅拷贝问题
来源:互联网 发布:php 会员下载系统源码 编辑:程序博客网 时间:2024/06/04 19:24
## JavaScript 中深拷贝浅拷贝问题
首先是堆(heap)和栈(stack)的区分:
js中基本数据类型,undefined、null、Boolean、Number 和 String直接存放在栈中;
引用类型,对象存放在堆中,栈内存中存放的是该对象的引用;
打开浏览器,F12在 console中输入或者命令行进入node输入(> :输入行,<:输出行)
```
> obj = {'1':'a','2':'b','3':'c'}
< Object {1: "a", 2: "b", 3: "c"}
> obj2 = obj
< Object {1: "a", 2: "b", 3: "c"}
> obj[2]='tttt'
< "tttt"
> obj2
< Object {1: "a", 2: "tttt", 3: "c"}
> obj
< Object {1: "a", 2: "tttt", 3: "c"}
```
因为obj和obj2 的引用指向的堆中同一块内存,所以改变了一个,另一个页随之改变,称之为浅拷贝;如果要实现深拷贝,必须遍历obj中所有的属性,赋值给新的对象;如果是多层嵌套,需要递归;实现的代码如下:
```
let deepCopy = function(src){
let ret = {};
for (let k in src){
ret[k]=typeof(k)=='object'?deepCopy(src[k]):src[k];
}
return ret;
}
```
##
```
> obj3 = deepCopy(obj);
< Object {1: "a", 2: "tttt", 3: "c"}
> obj1 === obj3
< false
```
如果是要深拷贝数组,可以new个新的数组,遍历赋值,或者直接使用slice()方法或者contant()方法,要说清楚一个问题不容易,关于这两个方法的具体内容,可以查文档;
##
关于Object.assgin(),ES6的新方法,可以实现对象的第一层的深拷贝,深层次的对象没有进行深拷贝,在此就不再详述,一时半会也说不清楚,具体可以自行搜索;该深拷贝数组还是没问题的;```var new_arr = Object.assigin([],old_arr)```
首先是堆(heap)和栈(stack)的区分:
js中基本数据类型,undefined、null、Boolean、Number 和 String直接存放在栈中;
引用类型,对象存放在堆中,栈内存中存放的是该对象的引用;
打开浏览器,F12在 console中输入或者命令行进入node输入(> :输入行,<:输出行)
```
> obj = {'1':'a','2':'b','3':'c'}
< Object {1: "a", 2: "b", 3: "c"}
> obj2 = obj
< Object {1: "a", 2: "b", 3: "c"}
> obj[2]='tttt'
< "tttt"
> obj2
< Object {1: "a", 2: "tttt", 3: "c"}
> obj
< Object {1: "a", 2: "tttt", 3: "c"}
```
因为obj和obj2 的引用指向的堆中同一块内存,所以改变了一个,另一个页随之改变,称之为浅拷贝;如果要实现深拷贝,必须遍历obj中所有的属性,赋值给新的对象;如果是多层嵌套,需要递归;实现的代码如下:
```
let deepCopy = function(src){
let ret = {};
for (let k in src){
ret[k]=typeof(k)=='object'?deepCopy(src[k]):src[k];
}
return ret;
}
```
##
```
> obj3 = deepCopy(obj);
< Object {1: "a", 2: "tttt", 3: "c"}
> obj1 === obj3
< false
```
如果是要深拷贝数组,可以new个新的数组,遍历赋值,或者直接使用slice()方法或者contant()方法,要说清楚一个问题不容易,关于这两个方法的具体内容,可以查文档;
##
关于Object.assgin(),ES6的新方法,可以实现对象的第一层的深拷贝,深层次的对象没有进行深拷贝,在此就不再详述,一时半会也说不清楚,具体可以自行搜索;该深拷贝数组还是没问题的;```var new_arr = Object.assigin([],old_arr)```
0 0
- JavaScript 中深拷贝浅拷贝问题
- JavaScript 深拷贝 & 浅拷贝
- 有关JavaScript中浅拷贝、深拷贝的简单研究
- JavaScript中堆栈和浅拷贝/深拷贝
- 关于python中深拷贝与浅拷贝问题
- Python中字典的浅拷贝和深拷贝问题
- C++中浅拷贝和深拷贝问题
- Javascript浅拷贝与深拷贝实现
- Javascript浅拷贝与深拷贝实现
- javascript中的深拷贝和浅拷贝
- javascript 深拷贝和浅拷贝
- JavaScript的深拷贝与浅拷贝
- JavaScript深拷贝和浅拷贝
- JavaScript深拷贝和浅拷贝
- javascript中的浅拷贝和深拷贝
- JavaScript的深拷贝和浅拷贝
- javascript中的深拷贝和浅拷贝?
- Javascript中的深拷贝与浅拷贝
- iOS 微信支付详细步骤及几个可能遇到的小问题
- 在jsp页面中使用JavaBean
- 使用AsyncTask下载图片并显示进度条
- Google C++测试单元工具 gtest简单使用(win vs & linux)
- MATLAB图像处理基础知识
- JavaScript 中深拷贝浅拷贝问题
- 程序开发资源网站收藏
- 451. Sort Characters By Frequency
- 多线程之线程池的应用
- 阈值处理
- 源码分析初级《篇一》 为何建议使用LayoutInflater.from而不用View.inflate
- 论找朋友与工作的重要性
- redis.properties文件的配置及说明
- shortWeekdaySymbols,NSLocale,NSDateComponents