js深拷贝

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,142评论 1 10
  • 本文思维导图如下: 本文首发于我的个人网站: http://cherryblog.site/本文作者: Cherr...
    sunshine小小倩阅读 1,066评论 2 14
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,963评论 2 17
  • 1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么? ...
    saintkl阅读 360评论 0 0
  • js中有一些基本数据类型,而对象就是像这样的{ name: 'Larry', skill: 'Node.js' }...
    铁木真丫丫丫阅读 231评论 0 0