关于深拷贝问题

为什么这个深拷贝无法得到函数func: function(){return 1}
是不是函数无法复制?

fucntion deepClone(source) {
    var targetObj = {};
    for(var keys in source) {
        if(source.hasOwnProperty(keys)) {
            if(source[keys] && typeof source[keys] === 'object') {
                targetObj[keys] = deepClone(source[keys]);
            }else{
                targetObj[keys] = source[keys];            
            }
        }
    }
    return targetObj;
}

var o1 = {
    arr: 1,
    obj: {
        key: 'value'
    },
    func: function(){
        return 1;
    }
}
var o3 = deepClone(o1);
console.log(JSON.stringify(o3));
阅读 2.1k
3 个回答

这个deepClone函数并没有对函数进行拷贝,只是返回了它的引用

JSON.stringify()在遇到不安全的JSON值会自动将其忽略,在数组中则会返回null(以保证单元位置不变)。

不安全的 JSON 值: undefined 、 function 、 symbol (ES6+)和包含循环引用(对象之间相互引用,形成一个无限循环)的 对象 都不符合 JSON 结构标准,支持 JSON 的语言无法处理它们

具体可以参考这篇我的这篇文章

不是function不复制,是JSON.stringify无法转化function。

o3.func()是可以执行的哟

clipboard.png

因为JSON.stringify 会将对象中值为undefined 和 function的内容丢掉。

如果你想让JSON.stringify处理后的对象,保留value为function的部分,需要你显式的增加一个replacer来处理,值为function的对象,即

JSON.stringify({a:function(){return 1}},function(k,v){
if(typeof v == 'function'){
return v.toString()
}
return v
})

这是JSON.stringify的文档
https://developer.mozilla.org...

推荐问题
宣传栏