Странное поведение функции JSON.parse () reviver - PullRequest
1 голос
/ 11 апреля 2019

Я использую второй параметр 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, который я не включил в оператор.

1 Ответ

0 голосов
/ 11 апреля 2019

Поскольку он также будет выполнять итерацию по всему объекту, который является {"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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...