实现一个深度拷贝(递归拷贝,一层层的拷贝)

判断数据类型的四种方法

  1. typeof
  2. instanceof
  3. Object.prototype.toString.call
  4. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值