Javascript深浅拷贝
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <!--Javascript有六种基本数据类型(也就是简单数据类型), 它们分别是:Undefined,Null,Boolean,Symbol,Number和String。 还含有一种复杂数据类型,就是对象--> <!--注意Undefined和Null的区别,Undefined类型只有一个值, 就是undefined,Null类型也只有一个值,也就是null Undefined其实就是已声明未赋值的变量输出的结果 null其实就是一个不存在的对象的结果--> <script type="text/javascript"> // 浅拷贝 var obj = { name:'wsscat', age:0 } var obj2 = obj; obj2['c'] = 5; console.log(obj);//Object {name: "wsscat", age: 0, c: 5} console.log(obj2);////Object {name: "wsscat", age: 0, c: 5} // 深拷贝 //对于数组我们可以使用slice()和concat()方法来解决上面的问题 //slice方法 var arr = ['wsscat', 'autumns', 'winds']; var arrCopy = arr.slice(0); arrCopy[0] = 'tacssw' console.log(arr)//['wsscat', 'autumns', 'winds'] console.log(arrCopy)//['tacssw', 'autumns', 'winds'] // concat方法 var arr = ['wsscat', 'autumns', 'winds']; var arrCopy = arr.concat(); arrCopy[0] = 'tacssw' console.log(arr)//['wsscat', 'autumns', 'winds'] console.log(arrCopy)//['tacssw', 'autumns', 'winds'] // 对象我们可以定义一个新的对象并遍历新的属性上去实现深拷贝 var obj = { name:'wsscat', age:0 } var obj2 = new Object(); obj2.name = obj.name; obj2.age = obj.age obj.name = 'autumns'; console.log(obj);//Object {name: "autumns", age: 0} console.log(obj2);//Object {name: "wsscat", age: 0} // 当然我们可以封装好一个方法来处理对象的深拷贝,代码如下 var obj = { name: 'wsscat', age: 0 } var deepCopy = function(source) { var result = {}; for(var key in source) { if(typeof source[key] === 'object') { result[key] = deepCopy(source[key]) } else { result[key] = source[key] } } return result; } var obj3 = deepCopy(obj) obj.name = 'autumns'; console.log(obj);//Object {name: "autumns", age: 0} console.log(obj3);//Object {name: "wsscat", age: 0} </script> </html>
数组中存放函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <!--在javascript中函数也是一种数据,能够像操作一个对象对它进行操作。 并且javascript不进行数据类型检查,数组可以存放任何东西, 在下面代码中我们不但在数组中存放了函数,并且也可以在存放一个执行函数的返回值, 所以数组前两个数据存放都是函数执行返回值--> <script type="text/javascript"> var funcA = function() { console.log("funcA"); return "hello funA"; } var funcB = function() { console.log("funcB"); return "hello funB"; } var funcC = function() { console.log("funcC"); return "hello funC"; } var arr = [funcA(), funcB(), funcC]; console.log(arr); arr[2](); </script> </html>
数组对象的深拷贝
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <script type="text/javascript"> Object.prototype.deepCopy = function() { var obj = null; //用于最后返回一个对象,这个对象是深复制的结果 for(var attr in this) { //遍历这个对象的每一个属性 if(this.hasOwnProperty(attr)) { //主要是递归自有属性 if(typeof(this[attr] === 'object')) { //如果对象的属性是一个对象,就递归复制它的每一个属性 if(this[attr] === null) { //如果对象为null obj[attr] = null; } else if(Object.prototype.toString(this[attr]) === '[object Array]') { //如果是个数组 obj[attr] = []; for(var i = 0; i < this[attr].length; i++) { obj[attr].push(this[attr][i].deepCopy()); } } else { //object obj[attr] = this[attr].deepCopy(); } } else { obj[attr] = this[attr]; } } } return obj; } </script> </html>