javascript语言中数据类型一共分为两大类:一是基本数据类型;而是复杂数据类型。基本数据类型包括:String,Number,Boolean,Null,Undefined Symbol(es6新增);复杂数据类型包括:Object。而其他引用类型(Date,Array,Regexp,Function)和基本包装类型(String,Number,Boolean),Math等都属于Object对象的实例对象。因此都可以继承Object原型对象上面属性和方法。
对于基本数据类型来讲,复制一个变量,等同于拷贝了一份原来变量的值,而原来变量的值的改变不会影响新的变量,而新的变量的改变同样不会影响到原来的变量。例如:
var a = 4;
var b = a;
a = 5;
console.log(b); //4
对于复杂数据类型来讲,变量只是指向这个对象的指针,当把一个对象变量赋值给另外一个变量的时候,其实是将指向这个对象的指针赋值给了他,这时两个变量都指向同一个对象,因此一个变量的改变会影响到另一个变量。同理所有引用数据类型(Array,Date,Regexp,Function)也是一样。比如:
var obj = {
name:'Tony',
age:'18'
}
var copyObj = obj;
copyObj.name='Lily';
console.log(obj.name); //Lily
obj.age=100;
console.log(copyObj.age); //100
******那么如何实现对象的浅拷贝呢?*******
es6为Object对象新增一个方法Object.assign(target, source1, source2)。第一个参数是目标对象,后面的是源对象。这个方法会把源对象上面的可枚举属性拷贝到目标对象上。但是这种拷贝属于浅拷贝。比如:
var target = {
name:'Tony',
age:18
}
var source = {
name:'Lily',
sex:'male'
}
var newObj = Object.assign(target,source);
console.log(newObj); // {name: "Lily", age: 18, sex: "male"}
注意:
1,如果源对象与目标对象或者源对象之间存在同名属性,则后面的会覆盖前面的。
2,如果源对象作为第一个参数,那么会将源对象的值改变成拷贝后的值,也就是会改变源对象。如果不想改变源对象的值,第一个参数可以给一个空对象{},然后取Object.assign的返回值(也就是拷贝后的值)。
******对象的深拷贝*******
对象的深拷贝可以通过JSON对象的两个方法,一是转换js对象转成字符串对象的JSON.stringify方法,另一个是将js字符串对象转换成js对象的JSON.parse方法。
var obj = {
name:'Tony',
age:18
}
var copy = JSON.parse(JSON.stringify(obj));
obj.name='Lily';
console.log(copy.name); //Tony
console.log(obj.name); // Lily
使用这种方式实现深复制有一个缺点就是必须给JSON.parse方法传入的字符串必须是合法的JSON,否则会抛出错误
网友评论