网站首页 > 知识剖析 正文
一、前言
在我们面试过程中,面试官经常会提及到深浅拷贝的问题。想必大多数小伙伴会说到
JSON.parse(JSON.stringify(obj))。正好今天我就和大家好好唠一唠这个JSON.stringify。
二、概念
JSON.stringify对于我们不陌生,一般用来处理序列化(深拷贝)。就是把我们的对象转换为JSON字符串,此方法确实很方便在我们的工作中,但是,这个方法也会有一些弊端,只是我们不怎么遇到。
let obj = {
name: 'iyongbao'
}
console.log(JSON.stringify(obj)); // {"name":"iyongbao"}
三、弊端
1. 对函数不友好
如果我们的对象属性是一个函数,那么在序列化的时候该属性会丢失。
let obj = {
name: 'iyongbao',
foo: function () {
console.log(`${ this.name }是一个小菜鸟!`)
}
}
console.log(JSON.stringify(obj)); // {"name":"iyongbao"}
2. 对undefined不友好
如果对象的属性值是undefined,转换后会丢失。
let obj = {
name: undefined
}
console.log(JSON.stringify(obj)); // {}
3. 对正则表达式不友好
如果对象的属性是一个正则表达式,转换后就会变成一个空的Object
let obj = {
name: 'iyongbao',
zoo: /^i/ig,
foo: function () {
console.log(`${ this.name }是一个小菜鸟!`)
}
}
console.log(JSON.stringify(obj)); // {"name":"iyongbao","zoo":{}}
4. 数组对象
如果是一个数组对象,以上的情况也会发生。
let arr = [
{
name: undefined
}
]
console.log(JSON.stringify(arr)); // [{}]
四、JSON.stringify拓展
说完了JSON.stringify的不足,下面我们来说一下你可能没有接触过的其他特性,希望看完会对你有所帮助。
1. 接收一个数组(过滤)
其实JSON.stringify有第二个参数,可能我们不经常用到。我们可以传入一个数组,值就是对应我们对象的key,我称之为过滤。
let obj = {
name: 'iyongbao',
age: 25,
hobby: ['JavaScript', 'Vue']
}
let res = JSON.stringify(obj, ['name']);
console.log(res); // {"name":"iyongbao"}
2. 接收一个函数
第二个参数也可以是一个函数,也是类似过滤的效果。
let obj = {
name: 'iyongbao',
age: 25,
hobby: ['JavaScript', 'Vue']
}
let res = JSON.stringify(obj, (key, value) => {
if (key === 'age') return undefined;
return value;
});
console.log(res); // {"name":"iyongbao","hobby":["JavaScript","Vue"]}
3. 缩进
第三个参数可以接收一个数字,表示缩进多少字符。
let obj = {
name: 'iyongbao',
age: 25,
hobby: ['JavaScript', 'Vue']
}
let res = JSON.stringify(obj, null, 2);
console.log(res);
4. 自身toJSON方法
对象可以有一个自身的toJSON属性,是一个有返回值的方法,用来输出我们自定义的数据样式。
let obj = {
name: 'iyongbao',
age: 25,
toJSON: function () {
return {
message: `${ this.name }的年龄为${ this.age }`
}
}
}
let res = JSON.stringify(obj);
console.log(res); // {"message":"iyongbao的年龄为25"}
五、总结
好了,今天就和大家分享到这吧。一般如果真涉及到深拷贝,我还是首选自己封装一个方法或者是使用第三方的插件库来做深拷贝,这样最保险,避免不必要的麻烦。
猜你喜欢
- 2024-11-18 你不知道的JavaScript中的5个JSON秘密功能
- 2024-11-18 从业二十年的测试工程师今天给大家分享postman的使用技巧
- 2024-11-18 手把手教你JSON解析完Cube数据,如何输出到Excel
- 2024-11-18 「jQuery-5」 JavaScript对象和json
- 2024-11-18 亲手带你 Debug Fastjson 的安全漏洞
- 2024-11-18 JSON数据格式
- 2024-11-18 你不知道的JSON.stringify神操
- 2024-11-18 JSON如何解析
- 2024-11-18 38.JavaScript:try...catch异常处理
- 2024-11-18 【两万字原创长文】完全零基础入门Fastjson系列漏洞(基础篇)
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)