缺点是对复杂的对象(Buffer、Date 等实例对象)无法实现深拷贝 functionmyDeepClone(obj){letclone;// 排除非引用类型数据if(obj==null||typeofobj!='object')returnobj;if(Array.isArray(obj)){// obj 是数组clone=newobj.constructor(obj.length)obj.forEach((value,index)=>{clone[index]=typeofvalue===...
使用typeof是无法判断function和array的,这里使用Object.prototype.toString方法。 [默认情况下,每个对象都会从Object上继承到toString()方法,如果这个方法没有被这个对象自身或者更接近的上层原型上的同名方法覆盖(遮蔽),则调用该对象的toString()方法时会返回"[object type]",这里的字符串type表示了一个对象类型][1]...
// Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject( copy ) || ( copyIsArray = jQuery.isArray( copy ) ) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray( src ) ? src : []; } else { clone = s...
4. 现代深拷贝structuredClone 在现代浏览器中,可以使用 structuredClone 方法来实现深拷贝,它是一种更高效、更安全的深拷贝方式。 以下是一个示例代码,演示如何使用 structuredClone 进行深拷贝: 复制 const kitchenSink={set: newSet([1,3,3]),map: new Map([[1,2]]),regex:/foo/,deep: { array:[new...
function deepClone (obj) { if(typeof obj !== "object" && typeof obj !== 'function') { return obj; //原始类型直接返回 } var o = isArray(obj) ? [] : {}; for(i in obj) { if(obj.hasOwnProperty(i)){ o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj...
例如,对于以下结构,仍然可以使用structuredClone()进行深拷贝: const originalObject = {set: new Set([1, 3, 3]),map: new Map([[1, 2]]),regex: /foo/,deep: { array: [ new File(someBlobData, 'file.txt') ] },error: new Error('Hello!')}originalObject.circular = originalObjectconst ...
functiondeepClone(obj) {// 如果值 值类型 或 null ,直接返回if(typeofobj !=='object'|| obj ===null) {returnobj; }letcopy = {};// 如果对象是数组if(obj.constructor===Array) { copy = []; }// 遍历对象的每个属性for(letkinobj) {// 如果 key 是对象的自有属性if(obj.hasOwnProperty...
实现deepClone 对于非引用值类型的数值,直接赋值,而对于引用值类型(object)还需要再次遍历,递归赋值。 function deepClone(data) { var t = type(data), o, i, ni; if(t === 'array') { o = []; }else if( t === 'object') { o = {}; ...
"deep": { "array": [ {} ] }, "error": {}, } 2. 使用递归 代码示例: function deepClone(obj) { if (obj === null || typeof obj !== 'object') { return obj; } let clone = obj.constructor(); for (let attr in obj) { ...
引用类型(如 object、array、function):按引用存储和传递 当你将一个对象赋值给另一个变量时,实际上只是复制了指向该对象的引用,而不是对象本身的内容: 复制 constoriginal={name:"John"};constcopy=original;copy.name="Jane";console.log(original.name);// 输出: "Jane" ...