• JSON,对象深拷贝


    JSON

    JavaScript Object Notation

    1、JSON是一个字符串 常常用于网络传输数据的一种字符串格式

    区别:

                querystring 查询字符串  "name=karen&pwd=abc123&count=20"

                template 模板字符串 `<div style="">666</div>`

                JSON  json字符串 '{"name":"karen","its":["hello","h5"]}' ('  ')

    2、JSON解析 parse(字符串解析)stringify(转成字符串)

    1. var re='{"name":"karen","its":["hello","h5",{"xx":20}]}'
    2. var obj=JSON.parse(re)
    3. console.log(re,obj)
    4. var obj={name:"karen"}
    5. var str=JSON.stringfy(obj)
    6. console.log(str)
    7. var obj={age:20}
    8. obj["age"]

    3、注意:

    JSON对象和数组的属性名必须是双引号括起来的字符串,并且最后一个属性后不能有逗号。

    对象深拷贝

    1、如果内部没有引用数据或者时间正则null等等数据时

    1. var obj={name:"karen"}
    2. // var obj2={}
    3. // obj2.name=obj.name
    4. var str=JSON.stringify(obj)//'{"name":"karen"}'
    5. var obj2=JSON.parse(str)//{name:"karen"}
    6. console.log(obj2,obj==obj2)//{name:"karen"} false

    2、自己设计deepcopy函数

    1. var obj={name:"karen",its:[10,20,30]}//[10,20,30,[90,100]]//null//"hello"//{x1:null,x2:new Date(),x3:"hello",son:{age:20}}
    2. var obj2=new Person()
    3. function deepcopy(data){
    4. //number
    5. if(typeof(data)=="object"){
    6. if(data.constructor==Date){
    7. return new Date(data.getTime())
    8. }
    9. else if(data==null){
    10. return null
    11. }
    12. else if(data.constructor==RegExp){
    13. return new RegExp(data)
    14. }
    15. else if(data.constructor==Array){
    16. var newArray=new Array()
    17. for(var i=0;i<data.length;i++){
    18. var temp=data[i]
    19. newArray.push(arguments.callee(temp))
    20. }
    21. return newArray
    22. }
    23. else{
    24. var newobj=new data.constructor() //new Object()
    25. // Object.keys()
    26. for (var key in data) {
    27. newobj[key]=arguments.callee(data[key])
    28. }
    29. return newobj
    30. }
    31. }
    32. else{
    33. return data
    34. }
    35. }
    36. var obj2=deepcopy(obj)
    37. // console.log(obj2,obj==obj2,obj[3]==obj2[3])
    38. console.log(obj2,obj==obj2,obj.its==obj2.its)
    1. Object.prototype.copy1=function () {
    2. //设计代码 让它有如下功能
    3. }
    4. var obj={name:"karen",infos:[{img:"xx",count:20}]}
    5. var obj2=obj.copy1()
    6. obj2.infos[0].count=30
    7. console.log(obj.infos[0].count)//30
    8. var obj3=obj.copy1(true)
    9. obj3.infos[0].count=40
    10. console.log(obj.infos[0].count)//30
    11. console.log(obj3.infos[0].count)//40
    12. // //方法1. 最简单的方式,缺陷是原型链没有拷贝 函数和null不会拷贝
    13. var copy1 = function (obj) {
    14. return JSON.parse(JSON.stringify(obj));
    15. }
    16. var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"wanger",e:new Date(),f:null,g:undefined}
    17. var b = copy1(a)
    18. // //方法2.利用自调用
    19. var copy1 = function (obj) {
    20. if(obj === null) return null
    21. if(typeof obj !== 'object') return obj;
    22. if(obj.constructor===Date) return new Date(obj);
    23. if(obj.constructor === RegExp) return new RegExp(obj);
    24. var newObj = new obj.constructor (); //保持继承链
    25. for (var key in obj) {
    26. if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
    27. var val = obj[key];
    28. newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
    29. }
    30. }
    31. return newObj;
    32. };

  • 相关阅读:
    Mysql - InnoDB引擎
    python - 类和对象
    AWK语言第二版 2.3转换
    MICCAI 2022:基于 MLP 的快速医学图像分割网络—UNeXt
    浏览器中输入URL后到底发生了什么?
    软考中级电子商务师含金量高嘛?
    前端一个页面依赖多个接口解决之node接口聚合
    npm报错
    iOS使用CMMotionActivityManager获取用户状态
    通过Handle(子类)::DownCast(父类)实现Geom2d_TrimmedCurve曲线段找源曲线段
  • 原文地址:https://blog.csdn.net/m0_63470734/article/details/125601237