欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

循环遍历多层json_面试官:JSON.stringify() 实现深拷贝有什么问题

发布时间:2023/12/4 javascript 61 豆豆
生活随笔 收集整理的这篇文章主要介绍了 循环遍历多层json_面试官:JSON.stringify() 实现深拷贝有什么问题 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

为什么要进行深拷贝

JS中的变量在内存中存储分为值类型和引用类型:

值类型:

1、占用空间固定,保存在栈中;

2、保存与复制的是值本身;

3、基本类型数据是值类型(String,Number,undefined,Boolean,Null);

引用类型:

1、占用空间不固定,保存在堆中;

2、保存与复制的是指向对象的一个指针;

3、使用new()方法构造出的对象是引用型;

所以像Object, Array 这样的复杂对象的,需要进行深拷贝;

JOSN.stringify() 深拷贝有什么问题?

最简单的深拷贝呗方式就是使用JSON.stringify();进行深拷贝;比例:

var obj={name:'大雄',age:21 }; var obj1=JSON.parse(JSON.stringify(obj));

这样深拷贝出来是完全没有问题的;假如我们有如下的对象,进行深拷贝呢

var obj1={name:'大雄',say:function(){console.log('我会说话哦!');},birthday:new Date('1990/01/01') }; var obj2=JSON.parse(JSON.stringify(obj)); console.log(obj2); // {name: "大雄", birthday: "1989-12-31T16:00:00.000Z"}

我们看到了,当我们的对象中有函数和日期类型是,日期类型被转化成了字符串;函数属性直接没有了!是不是问题很大!

经过我们测试我们发现:

1. undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略

2. Date 日期调用了 toJSON() 将其转换为了 string 字符串(Date.toISOString()),因此会被当做字符串处理。

3. NaN 和 Infinity 格式的数值及 null 都会被当做 null。

4. 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。

5. 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。

// 下面就是循环引用; var obj1 = {x: 1, y: 2 }; obj1.z = obj1; var obj2 = JSON.parse(JSON.stringify(obj1)); // 栈溢出,抛出错误;

所以当我们要克隆的对象里面还有引用类型时,我们只能采用递归的方法进行遍历了,这里就不展开了。

JOSN.stringify() 有几个参数?

> JSON.stringify(value[, replacer [, space]])

我们主要看一下 第二个参数和第三个参数时干啥用的

replacer 可选

1. 如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;

2. 如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;

3. 如果该参数为 null 或者未提供,则对象所有的属性都会被序列化;

var obj1={x:1,y:2 }; var obj2=JOSN.stringify(obj1,function(key,value){if(typeof value == 'number'){return value*2}return value; }); // "{x:2,y:4}"

我们再看一下 最后一个参数:

space 可选

1、指定缩进用的空白字符串,用于美化输出(pretty-print)

2、如果参数是个数字,它代表有多少的空格;

举个例子

var obj1={x:1,y:2}; JSON.stringify(obj1,null,'t'); "{"x": 1,"y": 2 }"

我我们用制表符来进行缩紧;

原创不易,请大家点赞关注,十分感谢!

总结

以上是生活随笔为你收集整理的循环遍历多层json_面试官:JSON.stringify() 实现深拷贝有什么问题的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。