首页 > 解决方案 > JSON.parse() reviver 函数的奇怪行为

问题描述

我正在使用 JSON.parse() 的第二个参数来修改结果,但我不太清楚函数参数的顺序以及它是如何工作的

我已阅读有关使用 reviver 功能的文档(例如https://www.ecma-international.org/ecma-262/6.0/#sec-json.parsehttps://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我没有包含在语句中的对象。

标签: javascriptjsonparsing

解决方案


因为它也会遍历对象 .{"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)


推荐阅读