<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>)</title>
</head>
<body>
<div>
</div>
<script>
let obj={
name: "张三",
age: "20",
sex: "男",
address: "深圳"
}
let array = [1,2,"3",4]
//为对象添加属性属性
obj['job']="web前端开发";
//console.log(obj)
/*
浅拷贝(数组): (会改变原数组)
就是数组A重新赋值给数组B,数组B里的属性值被改变,则数组A里的值也会跟着发生改变
*/
let array2 = array;
array2[1]="name"; //改变数组里的属性
//console.log(array); //[1, "name", 3, "4"]
//console.log(array2); //[1, "name", 3, "4"]
/*
深拷贝(数组): (不会改变原数组)
1.使用slice() 和 concat()方法来实现深拷贝
arrayObj.slice(start, [end]) 该方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。不会改变原数组
arrayObj.concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
2.利用循环实现
*/
// 1.使用slice() 和 concat()方法来实现深拷贝
let arr = ["A","B","C","D","E"];
let arrayCopy = arr.concat();
arrayCopy[0] = 1
//console.log(arr); // ["A", "B", "C", "D", "E"]
//console.log(arrayCopy); // [1, "B", "C", "D", "E"]
// 2.利用循环实现深拷贝
let aa1 = [9,8,7,6,5];
let aa2 = [];
aa1.forEach((item) => {
aa2.push(item);
})
//console.log(aa2); //[9,8,7,6,5]
/*
对象的浅拷贝:
就是对象A重新赋值给另一个对象B,对象B里的属性值被改变,则对象A里的值也会跟着发生改变
*/
let obj1 = {
name:'发哥',
age: 22
}
let obj2 = obj1;
obj2.name = 'fa哥'; //obj2改变nane属性值
console.log(obj1); //{name: "fa哥", age: 22}
console.log(obj2); //{name: "fa哥", age: 22}
/*
对象的深拷贝: (不会改变原对象的属性)
*/
var obj3 = {
name: '军哥',
age: 22,
}
//使用递归的方式实现数组、对象的深拷贝
function deepClone(obj) {
//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
//进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
//判断ojb子元素是否为对象,如果是,递归复制
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let objCopy = deepClone(obj3); //对象为改变前赋给新的变量
obj3.name = 'junge';
console.log(obj3);//Object {name: "junge", age: 22}
console.log(objCopy);//Object {name: "军哥", age: 22}
</script>
</body>
</html>
js里的(数组和对象)深浅拷贝
最新推荐文章于 2021-09-26 18:56:16 发布