ECMAScript包含两个不同类型的值:基本类型值和引用类型值。
基本类型值指的是简单的数据段;引用类型值指由多个值构成的对象。
当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。
1.基本类型
Undifined、Null、Boolean、Number和String。这五种基本数据类型可以直接操作保存在变量中的实际值。
基本类型要进行拷贝直接复制即可,看例子:
var sStr = "sunmengjun";
var cStr =sStr;
alert(cStr); //输出sunmengjun
alert(sStr); //输出sunmengjun
sStr = "abc";
alert(cStr); //输出sunmengjun;
alert(sStr); //输出abc;
把一个值赋给另一个变量时,当那个变量的值改变的时候,另一个值不会受到影响。
2.引用类型
如果不是基本类型,那么在进行拷贝操作的时候,不能只是简单的赋值操作,需要深拷贝:
(function(){
//深复制对象方法
function clone(Obj) {
var newObj;
if (Obj instanceof Array) {
newObj = []; // 创建一个空的数组
var i = Obj.length;
while (i--) {
newObj[i] = clone(Obj[i]);
}
return newObj;
} else if (Obj instanceof Object){
newObj = {}; // 创建一个空对象
for (var k in Obj) { // 为这个对象添加新的属性
newObj[k] = clone(Obj[k]);
}
return newObj;
}else{
return Obj;
}
}
//测试
var obj = {name:'sun',age:'25',sex:'male'};//设置一个对象
var newObj = clone(obj);//复制对象
console.log(newObj); //Object {name: "sun", age: "25", sex: "male"}
console.log(obj); //Object {name: "sun", age: "25", sex: "male"}
obj["name"] = 'meng';
console.log(newObj); //Object {name: "sun", age: "25", sex: "male"}
console.log(obj); //Object {name: "meng", age: "25", sex: "male"}
})()
PS : 深拷贝对象还有另一个解决方法,在对象中不含有函数的时候,使用JSON解析反解析就可以得到一个深拷贝对象