众所周知,前端得深拷贝有个很直接的方法,那就是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
})
运行结果如下:
这样相比直接的转化,不会丢失函数
var a = {
name: {
left: 1,
right: function() { console.log(123) }
}
}
var b = JSON.parse(JSON.stringify(a))
运行结果如下:
可以将函数也转化过来,但是前提函数必须用function方式声明,当然,我们可以完善函数的判断,就可以兼容多种函数的写法识别了。
顺带一提,JSON.Stringify()还支持第三个参数😀