>[danger] 数组/对象 -> 深拷贝/浅拷贝
*****
参考:
1. 浅拷贝, 例如:
```
var arr = [1, 2, 3, 4];
var brr = arr;
brr.push(5);
console.log(arr); // 结果: [1, 2, 3, 4, 5]
// 思考: 为什么往brr数组末尾插入元素5, arr数组也跟着改变了呢?
```
> 总结: 浅拷贝: 无论arr还是brr操作数组, 都会对, 对方产生影响
浅拷贝->影子.互相影响
![](https://box.kancloud.cn/ca7884465977de19745271275142061a_1117x660.png)
2. 深拷贝, 例如:
```
var arr = [1, 2, 3, 4];
var brr = new Array();
arr.map(item => {
brr.push(item);
})
brr.push(5);
console.log(arr); // 结果: [1, 2, 3, 4]
// 思考: 为什么这次brr没有影响arr呢?
```
> 总结:, 因为brr逐级拷贝, arr的值到自己的内存中, 摆脱原来数组/对象带来的影响
深拷贝->克隆人关系, 互不影响
![](https://box.kancloud.cn/a3adde6f76ea6c0d05c6e2a9ed20e306_1105x641.png)
*****
扩展: 项目中数组/对象常用深克隆方式
```
function deepClone(obj){
// 判断参数是数组还是对象, 准备一个空的
let objClone = Array.isArray(obj) ? [] : {};
// 非空, 并且是对象 (array或者object的typeof都是object)
if(obj && typeof obj === "object"){
// 遍历数组/对象
for(key in obj){
// 判断是否是当前对象的属性(防止复制原型链上的对象)
if(obj.hasOwnProperty(key)){
//判断obj子元素是否为对象,如果是,递归复制
if(obj[key] && typeof obj[key] === "object"){
objClone[key] = deepClone(obj[key]);
} else {
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
```
*****
思考: 当数组里保存的是对象, 改变对象的值, 会不会影响数组里的对象, 举例:
```
var arr = [
{
"name": "李东旭",
"age": 20
}
];
for (var i = 0; i < arr.length; i++){
arr[i]['name'] = "程序员";
}
console.log(arr); // 结果 里面的对象的name变成了"程序员"
```
*****
答案: 这里是浅复制, 可以影响arr数组里的对象
- web前端
- CSS问题
- 布局
- 双飞翼布局_flex方式
- 双飞翼布局_margin方式
- 圣杯布局_flex方式
- 圣杯布局_margin方式
- 子元素居中问题
- 弹性布局
- 概念_
- 标准模式与混杂模式
- 各种FC
- line-height
- vertical-align
- CSS3新特性
- 效果
- div添加箭头
- CSS绘制三角形
- JavaScript
- 兼容
- 事件相关
- 原理
- Ajax原理
- 继承原理
- 原型链继承
- 组合继承
- 寄生组合继承
- 数据绑定
- 1单向数据绑定m到c到v
- 2伪双向数据绑定
- 3双向数据绑定
- socket.io
- 运行时
- this指向
- 0.1+0.2问题
- 对象/数组-深拷贝&浅拷贝
- 事件循环
- typeof
- instanceof
- 概念
- 闭包
- 回调函数
- Promise
- 原生对象
- Attribute和property区别
- 防抖函数
- 节流函数
- 语言类型
- Vue
- Vue优缺点
- 仿Vue源码
- 1数据绑定_Observe
- 2数据绑定_订阅者&观察者定义
- 3数据绑定_Vue类实现
- 4数据绑定_Vue访问data更改
- 5DOM编译_Compile_双大括号模板讲解
- 6DOM编译_v-model讲解
- 7DOM编译_v-on:事件绑定讲解
- 项目总结
- 使用Svg图标
- vueCli环境_真机测试
- vueCli集成环信SDK
- 父子组件双向绑定
- React
- React优缺点
- 我的组件库
- Vue的组件库
- 环信_聊天组件
- 面试题
- HTML_分类
- CSS_分类
- JavaScript_分类
- VueJS_分类
- ReactJS_分类
- AngularJS_分类
- 浏览器端
- 笔试题
- CSS
- 特殊布局
- JavaScript_
- 经典_宏任务_微任务
- 浏览器问题
- CORS
- web服务器
- Apache
- 开启跨域
- Nginx
- 常用命令
- 正向代理
- 反向代理
- 负载均衡
- mac安装Nginx
- 配置80端口
- 算法
- 冒泡排序
- 选择排序
- 合并对象_排序
- 杨辉三角
- 红黑树
- 计算机基础
- 网络相关
- OSI七层模型
- http协议
- http工作原理
- https协议
- GET和POST区别
- hosts文件
- php相关
- session机制
- Linux
- 阿里云服务器
- linux使用Mysql
- 安装mysql
- 导入.sql文件
- 远程连接mysql
- linux使用xampp
- 安装Xampp
- 配置web访问
- 域名绑定服务器
- linux搭建git服务器_apache下
- 代码管理
- 什么是git
- 命令行_使用git
- .gitignore文件讲解
- 软件
- VSCode的安装
- 理财
- 基金
- 摄影