最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JSON.parse,JSON.stringify 深浅拷贝的缺陷

    正文概述 掘金(人生代码)   2021-01-14   421

    JSON.parse,JSON.stringify 深浅拷贝的缺陷

    经常使用 JSON.parse, JSON.stringify 的小伙伴都知道,他们两个可以用于深拷贝对象,但是可能会不太注意一些缺陷,是又一次我使用他们去深拷贝对象,我发现有些属性莫名其妙的丢失了,之前没有太深究其弊端,今天趁着有空深究一下这些弊端。

    首先我们来看下代码:

    let deepClone = function(obj) {
        return JSON.parse(JSON.stringify(obj))
    }
    let a = {
        name: 'Ken',
        age: 18,
        hobbit: ['dance', 'sing', {type: 'sports', value: 'run'}],
        schoolData: {
            grades: 'A',
        },
        run: function() {},
        walk: undefined,
        fly: NaN,
        cy: null
    }
    
    let b = deepClone(a)
    console.log("b", b)
    
    /**
    
    {
        age: 18,
        cy: null,
        fly: null,
        hobbit: (3) ["dance", "sing", {…}],
        name: "Ken",
        schoolData: {grades: "A"},
    }
    
     * */ 
    

    对比原有的对象,我们可以知道:

    1. 不会拷贝对象上的 value 值为 undefined 和 函数的键值对
    2. NaN,无穷大,无穷小会被转为 null

    自定义对象测试

    let Ken = function() {
        this.name = "Ken"
    }
    
    Ken.prototype.walk = function() {
        console.log("walk")
    }
    
    let KenNaNa = function() {
        Ken.call(this, arguments)
        this.name = "KenNaNa"
    }
    
    let tempFunc = function() {}
    tempFunc.prototype = Ken.prototype
    KenNaNa.prototype = new tempFunc()
    KenNaNa.prototype.age = "18"
    KenNaNa.prototype.run = function() {
        console.log("run")
    }
    
    Object.defineProperty(KenNaNa.prototype, "contructor", {
        value: KenNaNa,
        enumerable:false
    })
    
    let kenNaNa = new KenNaNa()
    let copyKenNaNa = JSON.parse(JSON.stringify(kenNaNa))
    
    /**
     Ken {age: "18", run: ƒ, contructor: ƒ}
     * */ 
    console.log(copyKenNaNa.constructor); // ƒ Object() { [native code]}
    console.log(copyKenNaNa.age) // undefined
    console.log(copyKenNaNa.run()) // is not function
    console.log(copyKenNaNa.walk()) // is not function 
    console.log(copyKenNaNa.toString()) // "[object Object]"
    
    1. 无法获取原型上面的方法,属性,只能获取 Object 原型的内容
    var date = new Date()
    var copy = JSON.parse(JSON.stringify(date))
    
    console.log("copy", copy) // "2021-01-14T06:47:12.337Z"
    

    总结

    1. 取不到值为 undefined 的 key
    2. NaN 和 无穷大,无穷小转变为 null
    3. 取不到原型的内容
    4. date 对象转变为 date 字符串

    起源地下载网 » JSON.parse,JSON.stringify 深浅拷贝的缺陷

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元