深浅拷贝:JSON.parse(JSON.stringify(obj))
序列化:将对象
转换为JSON字符串
javascript
let obj = {
name: 'String'
}
console.log(JSON.stringify(obj)); // {"name":"String"}
序列化弊端:
对象属性值为``函数
,序列化后
该属性
会丢失。
javascript
let obj = {
name: 'String',
foo: function () {
console.log(`${ this.name }是一个小菜鸟!`)
}
}
console.log(JSON.stringify(obj)); // {"name":"String"}
对象属性
值为undefined
,序列化
后该属性会丢失。
javascript
let obj = {
name: undefined
}
console.log(JSON.stringify(obj)); // {}
对象属性值
为正则表达式
,序列化
后该属性为{}
javascript
let obj = {
name: 'String',
zoo: /^i/ig,
foo: function () {
console.log(`${ this.name }是一个小菜鸟!`)
}
}
console.log(JSON.stringify(obj)); // {"name":"String","zoo":{}}
数组含对象,对象属性
值为undefined
,序列化
后该属性也会丢失。
javascript
let arr = [
{
name: undefined
}
]
console.log(JSON.stringify(arr)); // [{}]
序列化扩展:
JSON.stringify()``第二
个参数
可传入
一个数组
,值为对象
的key
,可获取该项。
javascript
let obj = {
name: 'String',
age: 25,
hobby: ['JavaScript', 'Vue']
}
let res = JSON.stringify(obj, ['name']);
console.log(res); // {"name":"String"}
JSON.stringify()``第二
个参数
可传入
一个函数,可遍历修改每一项。
javascript
let obj = {
name: 'String',
age: 25,
hobby: ['JavaScript', 'Vue']
}
let res = JSON.stringify(obj, (key, value) => {
if (key === 'age') return undefined;
return value;
});
console.log(res); // {"name":"String","hobby":["JavaScript","Vue"]}
JSON.stringify()第三
个参数
可传入数字
,表示缩进
多少字符
。
javascript
let obj = {
name: 'String',
age: 25,
hobby: ['JavaScript', 'Vue']
}
let res = JSON.stringify(obj, null, 2);
console.log(res); // 表示缩进2行
// {
// "name": "String",
// "age": 25,
// "hobby": [
// "JavaScript",
// "Vue"
// ]
// }
Object自身含有toJSON
属性,只有被 JSON.stringify()
调用时,toJSON
方法才会自动执行,用于自定义数据样式。
javascript
let obj = {
name: '小明',
age: 25,
toJSON: function () {
return {
message: `${ this.name }的年龄为${ this.age }`
}
}
}
let res = JSON.stringify(obj);
console.log(res); // {"message":"小明的年龄为25"}
注:toJSON
方法只在 JSON.stringify()
被调用时起作用。如果你直接访问对象的 toJSON
属性,你会得到函数本身,而不是它的执行结果。