判断数据类型的四种方法
- typeof
- instanceof
- Object.prototype.toString.call
- constructor
// 直接copy下面的方法去用即可
function deepClone(obj, hash = new WeakMap()) {
if (obj == null) return obj
if (obj instanceof Date) return new Date(obj)
if (obj instanceof RegExp) return new RegExp(obj)
if (typeof obj !== 'object') return obj
// array obj
// constructor
// 如果拷贝的对象是存在的,直接从WeakMap中返回即可
if (hash.has(obj)) return hash.get(obj)
let cloneObj = new obj.constructor
hash.set(obj, cloneObj)
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
cloneObj[key] = deepClone(obj[key],hash)
}
}
return cloneObj
}
//let obj = { age: { name: "清欢" }, fn: function () { }, a: undefined, //b: null, arr: [1, 2, 3, 4] }
//obj.xxx = obj // 循环引用,进入死循环
//let n = deepClone(obj)
//n.age.name = "清欢"
//console.log(obj);
map weakMap set 集合 map 映射
// set / map 是两种存储结构
let s = new Set([1, 2, 3, 1, 2, 3, 4, 5, 6])
console.log(typeof s);
// string array object boolean undefined symbol
// interator 是由迭代接口的
console.log([...s]);
// 集合: 并集 交集 差集
let a1 = [1, 2, 3, 4, 5, 6, 7]
let a2 = [1, 2, 3, 8, 9]
function union() {
let s1 = new Set(a1) // 去重
let s2 = new Set(a2) // 去重
let s3 = [...new Set([...s1, ...s2])] // 合并再去重
console.log(s3);
}
union()
// 交集
function intersetcion() {
return [...new Set(a1)].filter(item => {
return new Set(a2).has(item)
})
}
console.log(intersetcion());
// 差集
function diff() {
return [...new Set(a1)].filter(item => {
return !new Set(a2).has(item)
})
}
console.log(diff());
let m = new Map()
m.set("name", "xiaoyu")
m.set("name", "xiaowu")
let obj = { name: 2 }
m.set(obj, "3") // 这个obj的引用空间地址被set所占用 销毁不了
obj = null // 把obj清空
console.log(m);
// V8引擎的垃圾回收机制
let map = new WeakMap() // WeakMap() 弱引用
function MyFn() { }
let fn = new MyFn()
map.set(fn, "123")
fn = null