使用typeof是无法判断function和array的,这里使用Object.prototype.toString方法。 [默认情况下,每个对象都会从Object上继承到toString()方法,如果这个方法没有被这个对象自身或者更接近的上层原型上的同名方法覆盖(遮蔽),则调用该对象的toString()方法时会返回"[object type]",这里的字符串type表示了一个对象类型][1]...
缺点是对复杂的对象(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===...
Object它是一系列属性的无序集合, 包括函数Function和数组Array 使用typeof是无法判断function和array的,这里使用Object.prototype.toString方法。 [默认情况下,每个对象都会从Object上继承到toString()方法,如果这个方法没有被这个对象自身或者更接近的上层原型上的同名方法覆盖(遮蔽),则调用该对象的toString()方法时会返...
functiondeepClone(obj) {// 如果值 值类型 或 null ,直接返回if(typeofobj !=='object'|| obj ===null) {returnobj; }letcopy = {};// 如果对象是数组if(obj.constructor===Array) { copy = []; }// 遍历对象的每个属性for(letkinobj) {// 如果 key 是对象的自有属性if(obj.hasOwnProperty(...
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...
function deepClone(initalObj, finalObj) { var obj = finalObj || {}; for (var i in initalObj) { if (typeof initalObj[i] === 'object') { obj[i] = (initalObj[i].constructor === Array) ? [] : {}; arguments.callee(initalObj[i], obj[i]); ...
{"set": {},"map": {},"regex": {},"deep": {"array":[{}]},"error": {},} 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 2. 使用递归 代码示例: 复制 functiondeepClone(obj){if(obj===null||typeof obj!=='object'){returnobj;} ...
cloneDeep(objects); console.log(deep[0] === objects[0]); // => false 使用就是这么使用,看了眼源码是怎么实现,可以说lodash在深克隆方法的实现上真是全之又全,判断的项目测20来项,不仅有数据类型的判断,还有浮点数的判断,多少位的浮点数的判断,反正就是很多判断,以及边界考虑。 OH MY GOD,用它!
例如,对于以下结构,仍然可以使用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 ...
{if(parent.hasOwnProperty(i)) {//检测当前属性是否为对象if(typeofparent[i] === "object") {//如果当前属性为对象,还要检测它是否为数组//这是因为数组的字面量表示和对象的字面量表示不同//前者是[],而后者是{}child[i] = (Object.prototype.toString.call(parent[i]) === "[object Array]")...