Приоритет последовательности действий

Что должно выполниться первым JSON.parse или JSON.stringify?

Не могу понять порядок выполнения кода.

Обычно же выполнение кода идет сверху вниз?

let obj = {
  name: "Bratok",
  age: 19
};


let user2 = JSON.parse(JSON.stringify(obj)); // **Метка**


Ответы (4 шт):

Автор решения: Igor

Как может parse вызваться раньше чем stringify, если параметр для parse возвращается из stringify?


Что должно выполниться первым JSON.parse или JSON.stringify?

let temp = JSON.stringify(obj);
let user2 = JSON.parse(temp);
→ Ссылка
Автор решения: OPTIMUS PRIME

То же самое вы наверняка много раз не задумываясь использовали. Механизм не меняется от того, что там JSON.parse.

Если вместо аргумента функции написано выражение, прежде чем вызвать функцию, нужно выполнить выражение, чтобы узнать, какой аргумент передаем функции.

console.log( 2 * 3 ); — не удивительно, что выводит 6: Выполнилось выражение 2 * 3, результат которого передается в виде аргумента console.log

alert( Math.pow(2, 2) ); — Выше было выражение с оператором умножения, здесь - выражение с оператором вызова функции (). Сперва будет вызван pow, затем результат его вызова передается в вызов alert()

То же самое происходит при вызове JSON.parse( JSON.stringify(obj) ); и при любых других вложенных вызовах функций, «Изнутри наружу».

→ Ссылка
Автор решения: Евгений Третьяков

Правила такие же, как в математике. Сперва отработает то, что в скобках, затем то, что за их пределами. Код:

let user = JSON.parse(JSON.stringify(obj))

Будет равен коду:

let user = JSON.stringify(obj) 
anotherUser = JSON.parse(user) 
→ Ссылка
Автор решения: Qwertiy

Конструкция JSON.parse(JSON.stringify(obj)) вычисляется следующим образом:

JSON
JSON.parse
JSON.parse JSON
JSON.parse JSON.stringify
JSON.parse JSON.stringify obj
JSON.parse JSON.stringify(obj)
JSON.parse(JSON.stringify(obj))

Вот доказательство:

function scope(name) {
  return new Proxy(() => {}, {
    has(x, key) {
      if (key !== Symbol.unscopables) {
        console.log("Resolve:", key)
        return true
      }
    },
    get(x, key) {
      if (key !== Symbol.unscopables) {
        console.log("Get:", key)
        return scope(key)
      }
    },
    apply(x, me, args) {
      console.log("Call:", name)
      return scope()
    },
  })
}

with (scope()) {
  JSON1.parse(JSON2.stringify(obj))
}
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

→ Ссылка