js的数据类型分为基本数据类型与引用数据类型
深浅拷贝基本是在对引用数据类型才会产生影响
一、深浅拷贝的定义
浅拷贝:
只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存
深拷贝:
复制并创建一个一摸一样的对象,不共享内存,修改条新对象,旧对象保持不变
二、深浅拷贝的实现
浅拷贝:
(1)对象的浅拷贝
var obj = {
name: ‘zjs’,
age: 18
}
var obj2 = obj;
obj2.name = ‘yyq’
// 因为obj与obj2共用相同的内存地址,所以在对obj2的name进行修改的时候,obj的nae也会发生改变
(2)数组的浅拷贝
var arr = [1,2,3,‘4’]
var arr2 = arr;
arr2[1] = “test”
console.log(arr) // [1,‘test’,3,‘4’]
console.log(arr2) // [1,‘test’,3,‘4’]
// arr2是对arr的浅拷贝,两者的值发生变化时会互相影响
深拷贝:
(1)数组的深拷贝
在使用slice与concat对数组进行深拷贝的时候存在局限性
var arr = [‘a’,‘b’,‘c’];
var arrCopy = arr.slice(0);
arrCopy[0] = ‘test’
console.log(arr) // [“a”,“b”,“c”]
console.log(arrCopy) // [“test”,“b”,“c”]
// 使用js array中的slice对数组进行复制
// array.slice(start,end)
// 或者使用数组的concat(),对js的数组进行一个复制
(2)数组的深拷贝使用ES6的新特性
拓展运算符实现数组的深拷贝
var arr = [1,2,3,4,5]
var [ …arr2] = arr
arr[2] = 5
console.log(arr) // [1,2,5,4,5]
console.log(arr2) // [1,2,3,4,5]
(3) 对象的深拷贝
Object.assign()是介于深拷贝与浅拷贝之间的一种拷贝,在对象中的属性不是引用类型时可以实现深拷贝,但是如果对象中的属性属于引用类型此时,就不能实现深拷贝了。
// 拷贝对象中无引用类型属性
var a = {name : ‘miay’};
var b = Object.assign({},a);
console.log(a === b) //false
b.name = ‘chris’;
console.log(a.name) //miya
// 拷贝对象中存在引用类型的属性
var a = {name:{firstName:“tang”,lastName:“jiao”}}
var b = Object.assign({},a)
console.log(a === b); //false
b.name.firstName = “chen”
console.log(a.name.firstName) //chen
使用JSON.parse()和JSON.stringfy()对对象进行深拷贝
JSON.parse()的clone方法会忽略function和underfined的字段,且无法克隆Date类型
只能克隆原始对象自身的值,不能克隆它继承的值
· JSON.stringify() : 将JavaScript对象序列化为JSON字符串的值
· 语法:JSON.stringify(value[,replacer[,space])
· value:将要序列化为JSON字符串的值
· replacer:可选|过滤器的参数。(参数可能为数组、函数或null—)
· 数组:只有含有在这个数组中的属性名,才会显示
· 没有提供/null:则不过滤,属性全部显示
· space:可选|控制结果中的缩进和空白符。用于美化输出。(参数可能为数字或为null)
· 数字:上限为10,大于10则转换为10,大于10则取前10,替代空格显示
· 字符串:字符串长度最长不超过10个,大于10则取前10,替代空格显示
· 没有提供/null:没有空格
eg:
JSON.stringify({}); // ‘{}’
JSON.stringify(true); // ‘true’
JSON.stringify(“foo”); // ‘“foo”’
JSON.stringify([1, “false”, false]); // ‘[1,“false”,false]’
JSON.stringify({ x: 5 }); // ‘{“x”:5}’
JSON.stringify({x: 5, y: 6}); // “{“x”:5,“y”:6}”
JSON.parse()
功能:把JSON字符串解析为原生JavaScript对象
语法:JSON.parse(text[,reviver])
·text:要被解析为Javascript对象的字符串
·reviver:可选|函数,将在每个键值对上调用,用来修改解析生成的原始值,在parse返回之前调用
eg:
JSON.parse(‘{}’); // {}
JSON.parse(‘true’); // true
JSON.parse(‘“foo”’); // “foo”
JSON.parse(‘[1, 5, “false”]’); // [1, 5, “false”]
JSON.parse(‘null’); // null
由此先使用JSON.stringfy()先将对象转换为json格式的数据
var clone = function(obj){
return JSON.parse(JSON.stringify(obj));
}
var a = {
a:function(){console.log(‘hello world’)},
b:{c:1},
c:[1,2,3],
d:‘tang’,
e:new Date(),
f:null,
g:undefined
}
var b = clone(a);
console.log(b)
clone方法使用的parse和stringfy,会忽略function和undefined的字段,对date类型不支持,只能clone对象原始的值,并不能clone他继承的值