Przeglądaj źródła

深拷贝代码记录

kindring 3 lat temu
rodzic
commit
9412fe2396
1 zmienionych plików z 82 dodań i 0 usunięć
  1. 82 0
      js/比对.js

+ 82 - 0
js/比对.js

@@ -0,0 +1,82 @@
+/*
+ * @Description: 
+ * @Autor: kindring
+ * @Date: 2021-09-30 10:36:44
+ * @LastEditors: kindring
+ * @LastEditTime: 2021-09-30 14:34:37
+ * @LastDescript: 
+ */
+
+
+// 判断最终值是否相同
+function isEqual(obj1, obj2) {
+    if (obj1 instanceof Array) {
+        if (obj1.length != obj2.length) {
+            return false
+        }
+        for (let index = 0; index < obj1.length; index++) {
+            if (obj1[index] instanceof Object) {
+                if (!isEqual(obj1[index], obj2[index])) {
+                    return false
+                }
+            } else {
+                if (obj1[index] != obj2[index]) {
+                    return false
+                }
+            }
+        }
+    } else if (obj1 instanceof Object) {
+        if (Object.keys(obj1).length != Object.keys(obj2).length) {
+            console.log('对象值数量不一致');
+            return false
+        }
+        for (let key in obj1) {
+            // 防止循环引用
+            if (obj1[key] instanceof Object) {
+                if (!isEqual(obj1[key], obj2[key])) {
+                    return false
+                }
+            } else {
+                if (obj1[key] != obj2[key]) {
+                    return false
+                }
+            }
+        }
+    } else {
+        return obj1 == obj2
+    }
+    return true
+}
+
+console.log(isEqual(1, 2)); // false
+console.log(isEqual([1, 2], [1, 2])); // true
+console.log(isEqual([1], [1, 2])); // false
+console.log(isEqual([{ a: 1, b: 2 }], [{ a: 1, b: 2 }])); // true
+console.log(isEqual([{ a: 1, b: 2 }], [{ a: 1, b: 1 }])); // false
+console.log(isEqual([{ a: 1, b: 2 }], [{ a: 1 }])); // false
+console.log(isEqual({ a: 1, b: 2, c: [1, 2] }, { a: 1, b: 2, c: [1, 2] })); // true
+
+
+
+function deepClone(object, weakMap = new WeakMap()) {
+    if (typeof object === 'object') {
+        let cloneTarget = Array.isArray(object) ? [] : {}
+        if (weakMap.get(object)) {
+            return weakMap.get(object)
+        }
+        weakMap.set(object, cloneTarget)
+        for (const key in object) {
+            cloneTarget[key] = deepClone(object[key], weakMap)
+        }
+        return cloneTarget
+    } else {
+        return object
+    }
+}
+
+let o1 = { a: 1, b: [{ c: 2, d: 3 }] }
+console.log(o1);
+let o2 = deepClone(o1)
+console.log(o2);
+o1.a = 3;
+console.log(o2);