JSON
- 用于前后端数据交互的数据类型,是一个字符串
- Json.stringify 把object转换成string
- Json.parse(tmp)把string转换成object
深拷贝,浅拷贝
- 浅拷贝:赋值地址,一个变另一个也变(数组,对象)
- 深拷贝:一个变另一个不变(基本数据类型)
对象深克隆(仅限对象这种)
需求:将数组对象也去实现一个深拷贝的情况
解决办法:
- 方法一:利用stringify先转变成字符串,然后json用parse再变回对象,再改变属性值就可以达到深拷贝的效果了(实现方法如下)
<script>
// json用于前后端数据交互
var obj = {
name : "caoyuying",
age : "18",
info : {
grade:19,
profession:"CS"
}
}
console.log(obj)
console.log(typeof obj)
var obj1 = JSON.stringify(obj)
//想要进行对象深拷贝,必须先利用json把object变成字符串
obj1 = JSON.parse(obj1);
// 然后再把obj1变回对象并且赋值给自己,这一波操作之后就深拷贝了
obj1.name = "Aiors"
console.log(obj1.name)
console.log(obj1);
console.log(obj);
</script>
- 方法二:提取出对象下属性的值
<script>
var obj = {
name:"caoyuying",
age:"18",
info:{
height:"167cm",
weight:"55kg"
}
}
function deepclone(obj){
var temp = {}
for(var key in obj){
// console.log(key)
// console.log(obj[key])
if(typeof obj[key] === "object"){
temp[key] = deepclone(obj[key])
}else{
temp[key] = obj[key]
}
}
return temp
}
var obj1 = deepclone(obj) //这里需要给deepclone一个接收值
obj1.name = "Aiors"
console.log(obj1)
console.log(obj)
</script>
包含基本数据类型和引用数据类型的对象深克隆
需求增加:要求不只是引用数据类型可实行深拷贝,基本数据类型也可以执行深拷贝
- 先判断是基本数据类型还是引用数据类型
- 基本数据类型直接赋值
- 引用数据类型判断是数组还是对象
- Array.isArray(params)判断是不是数组,这里利用三目运算符
- 再进行for...in...循环(这里注意typeof 是强制校验数据类型,无论是数组还是对象返回的都是object)
<script>
function deepclone(params){
var temp;
// 先判断params是基本数据类型还是引用数据类型
if(typeof params === "object"){
//判断是引用数据类型中的哪一种,是数组还是对象
temp = Array.isArray(params) ? []:{}
for(var key in params){
if(typeof params[key] === "object"){
temp[key] = deepclone(params[key])
}else{
temp[key] = params[key]
}
}
}else{
temp = params;
}
return temp
}
console.log(deepclone("abc"))
console.log(deepclone([1,2,3,4]))
console.log(deepclone({
name:"caoyuying",
age:"18"
}))
</script>