对象引用(浅克隆和深克隆)

来源:互联网 发布:lil pump 知乎 编辑:程序博客网 时间:2024/05/20 03:41

一、s中的数据类型

  1. Js中数据类型分为两大类:(1)基本数据类型:数值、字符串、布尔值、nullundefined2)复杂数据类型:对象

二、克隆的概念:

   浅度克隆:基本数据类型为值传递,对象类型为引用传递

   深度克隆:所有属性和方法均完全复制,与原对象完全脱离,也就是说对于新对象的任何修改都不会反映到元对象中。


三.浅克隆的表现:

1.基本数据类型:

     var a="a";var b=a;b="b";console.log(a); //aconsole.log(b);//b

2.复杂数据类型:

1)函数的克隆

  函数也是对象,但是函数的克隆通过浅克隆就可以实现

   var a=function(){alert(1);};var b=a;b=function(){alert(2);};console.log(a);  //function(){alert(1);}console.log(b); //function(){alert(2);}

通过普通的负值方式,就是想了函数的克隆,并且不会影响之前的对象。原因就是函数的克隆会在内存中单独开辟一块空间,互不影响。

2)普通的对象


var oPerson={oName:"石倩蓉",oAge:"18",oAddress:{province:"beijing"},ofavorite:["swimming",{reading:"history"}]}function clone(obj){var result={};for(var key in obj){result[key]=obj[key];}return result;}var student=clone(oPerson);console.log(oPerson.oAddress.province);   //”beijing”student.oAddress.province="shanghai";console.log(oPerson.oAddress.province);   //”shanghai”

四.深度克隆实现

      为了保证对象的所有属性都被复制到,我们必须知道如果for循环以后,得到的元素仍是Object或者Array,那么需要再次循环,直到元素是原始类型或者函数为止。为了得到元素的类型

/*----------------------------数据类型的判断--------------------------------*/function isClass(obj){if(obj===null) return "null";if(obj===undefined) return "undefined";return Object.prototype.toString.call(obj).slice(8,-1);}/*------------------------------------------------------------*/function deepClone(o){var result;var oClass=isClass(o);if(oClass=="Object"){result={};}else if(oClass=="Array"){result=[];}else{return o;}for(var key in o){result[key]=arguments.callee(copy); //递归调用}return result;}/*------------------------------------------------------------*/var oPerson={oName:"shiqianrong",oAge:"24",oAddress:{province:"shanxi"},oFavoriate:["swimming",{reading:"history book"}]}/*------------------------------------------------------------*/var student=deepClone(oPerson);console.log(oPerson.oAddress.province);student.oAddress.province="shanghai";console.log(oPerson.oAddress.province);














0 0
原创粉丝点击