javascript - JSON.parse() reviver 函数的奇怪行为
问题描述
我正在使用 JSON.parse() 的第二个参数来修改结果,但我不太清楚函数参数的顺序以及它是如何工作的
我已阅读有关使用 reviver 功能的文档(例如https://www.ecma-international.org/ecma-262/6.0/#sec-json.parse和https://developer.mozilla.org/en -US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse )。据我了解,此函数适用于对象,第一个参数是键或属性名称,第二个函数是值或属性值。我不明白的是函数的返回值。
这就是它在示例中所做的
var obj1 = '{"a":1, "b":42}';
let text = JSON.parse(obj1, (key, value) => {
if (typeof value === 'number'){
return value * 2
}
else{
return value
}
}
)
console.log(text) // {"a": 2, "b": 84}
这工作得很好。但是当我尝试修改代码时,因为我知道所有值已经是数字
var obj1 = '{"a":1, "b":42}';
let text = JSON.parse(obj1, (key, value) =>{
return value * 2
})
console.log(text) // NaN
我很奇怪为什么当我删除return value
它时它不起作用。我的意思是,当我使用该函数时,没有一个值返回未定义value*2
。然后我尝试另一个测试
var obj1 = '{"a":1, "b":42}';
let text = JSON.parse(obj1, (key, value) => {
if (typeof value === 'number'){
console.log('This is in if',key, value)
return value * 2
}
else{
console.log('This is in else', key, value)
return value
}
}
)
console.log(text)
另一个奇怪的事情发生在else
语句中的代码运行时,即使它因为条件不正确而假设不运行。当它运行时,它甚至会打印出obj1
我没有包含在语句中的对象。
解决方案
因为它也会遍历对象 .{"a":1, "b":42}
它将从最嵌套的级别开始,然后将返回原始值本身,即{"a":1, "b":42}
.
根据MDN
如果指定了 reviver,则解析计算的值在返回之前进行转换。具体来说,计算值及其所有属性(从最嵌套的属性开始并继续到原始值本身)分别通过 reviver
顺便说一句,你可以缩短你的功能。
var obj1 = '{"a":1, "b":42}';
let text = JSON.parse(obj1, (_, value) => value * 2 || value)
console.log(text)
推荐阅读
- http - URL“/?v1 =”背后的目的是什么
- c# - C# Datatable .AsParallel() AsOrdered() 没有按顺序提供数据
- java - 如何比较java Set中的键值
- r - 使用 dplyr 一次转换不同格式的日期
- sql-server - ASP.NET Core MVC 和 Entity Framework 输出参数在调用存储过程时不返回
- javascript - Vue.js 将回调作为 prop 传递给子组件,并在单击时在父组件上执行
- testing - Testcafe 检查 DOM 元素是否不存在
- java - 试图解决一个包裹比另一个包裹更贵的情况下显示运输成本的问题(Java)
- ios - 显示和开销对 iOS 的高电池影响
- laravel - laravel 7中的表单操作中未定义路线