阅读 79

前端深拷贝又一实践

众所周知,前端得深拷贝有个很直接的方法,那就是JSON.parse(JSON.stringify()),但是奈何不能转化函数,今天才知道,原来JSON.parse()和JSON.stringify()居然还有第二个参数,而且还可以是个函数,所以我们就可以这样

var a = {
    name: {
        left: 1,
        right: function() { console.log(123) }
    }
}
var b = JSON.parse(JSON.stringify(a, (key, val) => {
    return val?.constructor === Function ? val.toString() : val
}), (key, val) => {
    return val?.includes?.('function') ? eval('(' + val + ')') : val 
})
复制代码

运行结果如下:

image.png 这样相比直接的转化,不会丢失函数

var a = {
    name: {
        left: 1,
        right: function() { console.log(123) }
    }
}
var b = JSON.parse(JSON.stringify(a))
复制代码

运行结果如下:

image.png

可以将函数也转化过来,但是前提函数必须用function方式声明,当然,我们可以完善函数的判断,就可以兼容多种函数的写法识别了。

顺带一提,JSON.Stringify()还支持第三个参数😀

nice.png

文章分类
前端
文章标签