js 深拷贝 JSON.stringfy

深拷贝的常用的几种方式

  1. Object.assign 其实是浅拷贝,但是数据如果只有一级,可以当作深拷贝使用;层级多的话 不可以
  2. JSON.parse(JSON.stringfy()) 有缺陷;如果有function会丢失;如果有Date数据类型,会转为字符串;undefined 会丢失;学习参考
    function / symbol/ undefined :
let fn = function fn() {}
let un = undefined
let sym = Symbol('')

如果出现在数组中会转为null;

let arr = [fn, un, sym]  
console.log(JSON.stringify(arr))
vconsole.min.js?65ce:10 [null,null,null]`

如果出现非数组对象中会被忽略; 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中;

let obj = {fn: fn, un: un, sym: sym}
console.log(JSON.stringify(obj))
vconsole.min.js?65ce:10 {}

如果单独出现 则返回undefined;

console.log(JSON.stringify(fn))
vconsole.min.js?65ce:10 undefined
console.log(JSON.stringify(un))
vconsole.min.js?65ce:10 undefined
console.log(JSON.stringify(sym))
vconsole.min.js?65ce:10 undefined

JSON.stringfy 一共有三个参数, 第二个参数可以传入函数或者数组
传入函数的话: 作为函数,它有两个参数,键(key)和值(value),它们都会被序列化。
传入数组:数组的值代表将被序列化成 JSON 字符串的属性名
在这里插入图片描述

  1. 自己手写deepCopy
function deepCopy(data) {
       if(!data) return
       if(Object.prototype.toString.call(data) == '[object Array]')
       {
        let newData = []
           for (const key in data) {
               newData[key] = deepCopy(data[key])
           }
           return newData
       } else if(Object.prototype.toString.call(data) == '[object Object]')
       {
        let newData = {}
           for (const key in data) {
               newData[key] = deepCopy(data[key])
           }
           return newData

       } else if(Object.prototype.toString.call(data) == '[object Funtion]')
       {
           return new Function(`return ${data.toString()}`).call(this)

       }else if(Object.prototype.toString.call(data) == '[object Date]')
       {
        return new Date(data.valueOf())

       }else if(Object.prototype.toString.call(data) == '[object RegExp')
       {
           return new RegExp(data)
       }else if(Object.prototype.toString.call(data) == '[object Set]')
       {
           let set = new Set()
            for (const v of data) {
               set.add(clone(v))
            }
            return set
       }else if(Object.prototype.toString.call(data) == '[object Map]')
       {
           let map = new Map()
           data.forEach((k, v) => {
               map.set(k, deepCopy(v))
           })
           return map

       }
       return data
    }
  1. 使用lodash 库

如果对你有帮助,麻烦点个赞 谢谢~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值