js实用方法-深度克隆.md
场景
当我们创建一个对象,想深度克隆的时候,如果是json或array,我们可以用
var result=JSON.parse(JSON.stringify( source))
达到深度克隆的效果,但这种只适用于纯数据的数组或者对象克隆。
下面为大家呈现一段,能对几乎所有类型进行深度克隆的javascript代码。
代码
/**
* @Description 克隆对象
* 能被克隆的对象类型:
* Plain object, Array, TypedArray, number, string, null, undefined.
* 直接用原始数据进行赋值的数据类型:
* BUILTIN_OBJECT
* 用户定义类的实例将克隆到一个原型中没有属性的普通对象。
* @method clone
* @param {*} source
* @return {*} new
*/
function clone(source) {
if (source == null || typeof source !== 'object') {
return source;
}
var result = source;
var typeStr = Object.prototype.objToString.call(source);
if (typeStr === '[object Date]') {
result = new Date().setTime(obj.getTime());
}
else if (typeStr === '[object RegExp]') {
result = this.cloneRegExp(source);
}
else if (typeStr === '[object Function]') {
result = this.cloneFunction(source);
}
else if (typeStr === '[object Array]') {
result = [];
for (var i = 0, len = source.length; i < len; i++) {
result[i] = this.clone(source[i]);
}
}
else if (this.TYPED_ARRAY[typeStr]) {
var Ctor = source.constructor;
if (source.constructor.from) {
result = Ctor.from(source);
}
else {
result = new Ctor(source.length);
for (var i = 0, len = source.length; i < len; i++) {
result[i] = this.clone(source[i]);
}
}
}
else if (!this.BUILTIN_OBJECT[typeStr] && !this.isDom(source)) {
result = {};
for (var key in source) {
if (this.hasOwn(source, key)) {
result[key] = this.clone(source[key]);
}
}
}
return result;
}
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果