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