当前位置: 首页 > 面试题库 >

实现js中所有对象的深度克隆(包装对象,Date对象,正则对象)?

霍建章
2023-03-14
本文向大家介绍实现js中所有对象的深度克隆(包装对象,Date对象,正则对象)?相关面试题,主要包含被问及实现js中所有对象的深度克隆(包装对象,Date对象,正则对象)?时的应答技巧和注意事项,需要的朋友参考一下

参考回答:

通过递归可以简单实现对象的深度克隆,但是这种方法不管是ES6还是ES5实现,都有同样的缺陷,就是只能实现特定的object的深度复制(比如数组和函数),不能实现包装对象Number,String , Boolean,以及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:

 

 

 类似资料:
  • deepClone 对象深度克隆 注意 由于JS对象包括的范围非常广,加上ES6又有众多的新特性,很难、也没必要做到囊括所有的类型和情况,这里说的"对象",指的是普通的对象,不包括修改对象原型链, 或者为"Function","Promise"等的情况,请留意。 场景: 我们平时可能会遇到需要通过console.log打印一个对象,至执行打印的时刻,此对象为空,后面的逻辑中对此对象进行了修改赋值,

  • 本文向大家介绍对象深度克隆的简单实现?相关面试题,主要包含被问及对象深度克隆的简单实现?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: ES5的常用的对象克隆的一种方式。注意数组是对象,但是跟对象又有一定区别,所以我们一开始判断了一些类型,决定newObj是对象还是数组~

  • 问题 你想复制一个对象,包含其所有子对象。 解决方案 clone = (obj) -> if not obj? or typeof obj isnt 'object' return obj if obj instanceof Date return new Date(obj.getTime()) if obj instanceof RegExp flags

  • 假设我有这门课: 以及子类: 我知道这是不可能的,但我想你明白我想要什么。如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。我想我想要但不允许的是: 如果Foobar实现了Cloneable,并且没有扩展AbstractFoo,那么子类就可以工作。 除了扩展的抽象类,我怎么能做到“相同”?

  • 本文向大家介绍如何实现对象克隆?相关面试题,主要包含被问及如何实现对象克隆?时的应答技巧和注意事项,需要的朋友参考一下 实现 Cloneable 接口并重写 Object 类中的 clone() 方法。 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

  • 问题内容: 我想知道是否有任何方法可以执行以下操作。我有一个抽象类,及其所有不同的子类,我想覆盖clone方法。我要在方法中做的就是从当前方法中创建一个新方法。显然,由于抽象,我无法执行以下操作。还有另一种方法可以执行此操作,因为仅为了简单的名称更改而在每个子类中覆盖克隆似乎没有用。 问题答案: 您可以尝试使用反射: } 在clone()方法中,调用getClass()。因为ACloneble i