JSON.stringify 之 5 大隐秘特性

众所周知,JSON.stringify() 方法可以将一个 Js 对象或值转换成一个 JSON 字符串。

作为一名 JavaScript 开发人员,JSON.stringify() 是用于调试最常见的函数。除了变为JSON字符串,它存在的意义还有什么呢,在调试中,我们不能运用 console.log() 来做相同的工作吗?让我们继续往下看。

//初始化一个 user 对象
const user = {
 "name" : "why",
 "age" : 29
}

console.log(user);

// 结果
// [object Object]

哦?console.log() 并没有协助我们打印出希望的成果。它输出的是 [object Object],因为从对象到字符串的默认转化是 [object Object]。因此,我们需要使用 JSON.stringify() 首先将目标转化成字符串,然后在控制台中打印,如下所示。

const user = {
 "name" : "why",
 "age" : 29
}

console.log(JSON.stringify(user));

// 结果
// "{ "name" : "why", "age" : 29 }"

一般情况下,开发人员使用 stringify 函数的场景较为普遍,就像我们在上面那样。但我要告知你一些隐藏的特性,这些小特性会让你开发起来愈加轻松。

JSON.stringify的第二个参数(数组)

stringify 函数也能够有第二个参数。它要操控台打印目标的键数组。看起来很简单?让咱们更深化一点。我们有一个目标 product 并且我们还想知道 product 的 name 的属性值。当我们将它打印出来时,它会输出下面的成果。

{
"id":"0001",
"type":"donut",
"name":"Cake","
ppu":0.55,
"batters":{
		"batter":[
				{"id":"1001","type":"Regular"},		
				{"id":"1002","type":"Chocolate"},
				{"id":"1003","type":"Blueberry"},	
				{"id":"1004","type":"Devil’s Food"}
				]
	},
"topping":[
		{"id":"5001","type":"None"},
		{"id":"5002","type":"Glazed"},
		{"id":"5005","type":"Sugar"},
		{"id":"5007","type":"Powdered Sugar"},
		{"id":"5006","type":"Chocolate with Sprinkles"},
		{"id":"5003","type":"Chocolate"},
		{"id":"5004","type":"Maple"}
		]
}

在log中很难找到 name 这个key键,因为操控台上显示了全部信息,但很多信息我们都用不到。当对象变大时,查找属性的难度随之添加。stringify 函数的第二个参数这时就有用了。让我们重写代码并检查结果。

console.log(JSON.stringify(product,['name' ]);

// 结果
{"name" : "Cake"}

我们的问题解决了,与打印整个 JSON 对象不同,我们可以在第二个参数中,将所需的key键作为数组传递,从而只打印出我们所需的属性。

JSON.stringify的第二个参数(函数)

我们还能够传入函数作为第二个参数。它会依据函数中写入的逻辑来计算每个键值对。假如返回 undefined,则不会打印键值对。请参考以下示例:

const user = {
 "name" : "why",
 "age" : 29
}

console.log(
	JSON.stringify(user,(key,value)=>{
		if(typeof value === 'string'){
			return undefined;
		}
		return value;
	})
)

// 结果 只有 age 被打印出来,因为函数判断 typeOf 为 String 的值返回 undefined。
{ "age" : 29 }

官方提供 toJSON 方法

官方提供了一个叫 toJSON 的方法fn,它可以作为任意对象的属性。JSON.stringify 返回这个函数的结果并对其进行序列化,而不是将整个对象转换为字符串。eg如下:

const user = {
 firstName : "Hongyan",
 lastName : "WANG",
 age : 26,
 toJSON() {
    return { 
      fullName: `${this.firstName} + ${this.lastName}`
    };
 }
}

console.log(JSON.stringify(user));
// 结果
// "{ "fullName" : "HongyanWANG"}"

这儿我们就可以看到,拥有toJSON方法后,它只打印 toJSON 函数的成果,而不是打印整个对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值