js对象深复制的方法总结(包装对象,Date对象,正则对象)
2017-12-09 15:15
387 查看
简要介绍:在文章http://blog.csdn.net/liwusen/article/details/74190031中介绍了简单实现深复制的方法,但是这种方法不管是ES6还是ES5实现,都有同样的缺陷,就是只能实现特定的object的深度复制(比如数组和函数),不能实现包装对象Number,String , Boolean,以及Date对象,RegExp对象的复制。
1 . 前文的方法
这种方法可以实现一般对象和数组对象的克隆,比如:
但是不能实现例如包装对象Number,String,Boolean,以及正则对象RegExp和Date对象的克隆,比如:
2 . valueof()函数
所有对象都有valueOf方法,valueOf方法对于:如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,而且大多数对象无法真正表示为一个原始值,因此默认的valueOf()方法简单地返回对象本身,而不是返回一个原始值。数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的valueOf()方法只是简单返回这个对象本身。
对于原始值或者包装类:
其实对于包装类,完全可以用=号来进行克隆,其实没有深度克隆一说,
这里用valueOf实现,语法上比较符合规范。
对于Date类型:
因为valueOf方法,日期类定义的valueOf()方法会返回它的一个内部表示:1970年1月1日以来的毫秒数.因此我们可以在Date的原型上定义克隆的方法:
对于正则对象RegExp:
1 . 前文的方法
function deepClone(obj){ var newObj= obj instanceof Array?[]:{}; for(var i in obj){ newObj[i]=typeof obj[i]=='object'? deepClone(obj[i]):obj[i]; } return newObj; }
这种方法可以实现一般对象和数组对象的克隆,比如:
var arr=[1,2,3]; var newArr=deepClone(arr); // newArr->[1,2,3] var obj={ x:1, y:2 } var newObj=deepClone(obj); // newObj={x:1,y:2}
但是不能实现例如包装对象Number,String,Boolean,以及正则对象RegExp和Date对象的克隆,比如:
//Number包装对象 var num=new Number(1); typeof num // "object" var newNum=deepClone(num); //newNum -> {} 空对象 //String包装对象 var str=new String("hello"); typeof str //"object" var newStr=deepClone(str); //newStr-> {0:'h',1:'e',2:'l',3:'l',4:'o'}; //Boolean包装对象 var bol=new Boolean(true); typeof bol //"object" var newBol=deepClone(bol); // newBol ->{} 空对象 ....
2 . valueof()函数
所有对象都有valueOf方法,valueOf方法对于:如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,而且大多数对象无法真正表示为一个原始值,因此默认的valueOf()方法简单地返回对象本身,而不是返回一个原始值。数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的valueOf()方法只是简单返回这个对象本身。
对于原始值或者包装类:
function baseClone(base){ return base.valueOf(); } //Number var num=new Number(1); var newNum=baseClone(num); //newNum->1 //String var str=new String('hello'); var newStr=baseClone(str); // newStr->"hello" //Boolean var bol=new Boolean(true); var newBol=baseClone(bol); //newBol-> true
其实对于包装类,完全可以用=号来进行克隆,其实没有深度克隆一说,
这里用valueOf实现,语法上比较符合规范。
对于Date类型:
因为valueOf方法,日期类定义的valueOf()方法会返回它的一个内部表示:1970年1月1日以来的毫秒数.因此我们可以在Date的原型上定义克隆的方法:
Date.prototype.clone=function(){ return new Date(this.valueOf()); } var date=new Date('2010'); var newDate=date.clone(); // newDate-> Fri Jan 01 2010 08:00:00 GMT+0800 (中国标准时间)
对于正则对象RegExp:
RegExp.prototype.clone = function() { var pattern = this.valueOf(); var flags = ''; flags += pattern.global ? 'g' : ''; flags += pattern.ignoreCase ? 'i' : ''; flags += pattern.multiline ? 'm' : ''; return new RegExp(pattern.source, flags); }; var reg=new RegExp('/111/'); var newReg=reg.clone(); //newReg-> /\/111\//
相关文章推荐
- 第192天:js---Date对象属性和方法总结
- js内置对象常用方法总结 上篇(Date String Array Math )
- Js中JSON字符串和对象互转的方法总结
- js入门·对象属性方法大总结
- Js中JSON字符串和对象互转的方法总结
- js入门·对象属性方法大总结
- jsdate对象toLocaleString()方法小结
- 转"js入门·对象属性方法大总结"
- javascript操作正则表达式对象的方法总结
- js对象属性方法大总结
- JS判断对象是否存在的10种方法总结
- js对象属性方法大总结
- js中内置对象Date的方法介绍
- js的Date对象的属性和方法
- js中对象复制以及apply方法的使用
- js入门·对象属性方法大总结
- js入门·对象属性方法大总结
- JS中Date对象getYear()方法和getFullYear()方法区别
- js入门·对象属性方法大总结
- JavaScript第四章知识点总结——JS内置对象 Array Date Math