JSON.parse()Reviver函数的奇怪行为

时间:2019-04-11 03:15:27

标签: javascript json parsing

我正在使用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对象,我没有在语句中包含它。

1 个答案:

答案 0 :(得分:0)

因为它还将遍历对象{"a":1, "b":42}。它将从大多数嵌套级别开始,然后再返回原始值{"a":1, "b":42}

根据MDN

  

如果指定了reviver,则在返回之前将转换通过解析计算的值。具体来说,计算得出的值及其所有属性(从嵌套最多的属性开始,一直到原始值本身)分别在整个齐整器中运行

通过这种方式可以缩短功能。

var obj1 = '{"a":1, "b":42}';
let text = JSON.parse(obj1, (_, value) => value * 2 || value)
 console.log(text)