美文网首页
js深拷贝

js深拷贝

作者: 梦夜空中最亮的星 | 来源:发表于2017-12-06 16:14 被阅读0次

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解析反解析就可以得到一个深拷贝对象

相关文章

网友评论

      本文标题:js深拷贝

      本文链接:https://www.haomeiwen.com/subject/eulkixtx.html