Javascript Engine позволяет делать множество вещей. С тем, что сильно, следует обращаться с осторожностью. Если вы сойдете с ума и пропустите трек, вас ударят. Всегда помните о работе в браузерах конечных пользователей. Вы можете ввести ошибку на лету, но вы не можете ее исправить. Я разрывал паутину несколько раз, так что теперь пульс успокоился. Если вы один из самых сумасшедших водителей, вы всего в одном шаге от того, чтобы попасть под удар. Итак, я бы порекомендовал вам пересмотреть то, как вы работаете с Javascript.

Давайте поговорим об одной из самых затратных операций в Javascript.

JSON.stringify

Ондолжен повторять свойства объекта, и его прототипная цепочка собирает пары ключ-значение и создает возвращаемую выходную строку. В этом случае, если это не является желаемым результатом использования JSON.stringify, всегда лучше избегать использования и пересматривать решение, которое вы пытаетесь решить

Я называю Javascript свободно типизированным языком. Книги читают их как динамически типизированный язык. Оба одинаковы, но в отношении этой операции она приносит вам больше боли и подвержена ошибкам. Когда мы говорим о языке с динамической типизацией, мы не можем определить тип данных объекта при его создании. Это тоже сила Javascript! Но значение времени выполнения и его изменяющийся тип данных неизбежно возвращают неожиданные результаты в вашей программе. Из-за этих результатов другой зависимый модуль начнет вести себя неправильно. Давайте посмотрим, как это работает, и исправим ошибку с помощью исправления.

let node = {
    firstName: 'John',
    lastName: 'Doe',
    address: {
        street: 'Buffalo Street',
        city: 'NewYork'
    }
};

Это идеальный объект с тремя свойствами firstName lastName и address Теперь давайте поиграем с JSON.stringify.

// Run stringify against the variable 'node'
JSON.stringify(node);
// Output contains all properties, values and properties of properties and it's corresponding value"{"firstName":"John","lastName":"Doe","address":{"street":"Buffalo Street","city":"NewYork"}}"
Note: This confirms that this operation is costly. Every time when you run this, it iterates again and produce results. The return value is not cached.

Все хорошо и идеально до этого момента. Теперь давайте попробуем смешать и сопоставить.

Скажем, например, вы вводите другое свойство, называемое fullName, и оно выглядит следующим образом.

// Add a property called fullName to concatenate the names
node.fullName = function() {
    return `${this.firstName} ${this.lastName}`;
};
// Rerun the stringify function to check, it returns same output
JSON.stringify(node);
// Output
{"firstName":"John","lastName":"Doe","address":{"street":"Buffalo Street","city":"NewYork"}}"
Note: This is because JSON doesn't allow methods / functions any runtime datatypes will not produce expected results

Если вы думаете, что это неприемлемо, я бы сказал, что это нормально. Поскольку ошибки нет, мы также можем не захотеть включать возвращаемое значение fullName в результаты stringify. Давайте сделаем это еще более сумасшедшим

// Now introduce a pointer and make it point to itself
node.next = node;
// Rerun the stringify function you will see this error
JSON.stringify(node);
// Output is an error
VM1208:1 Uncaught TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Object'
    --- property 'next' closes the circle
    at JSON.stringify (<anonymous>)
    at <anonymous>:1:6
Note: Why so? Because it iterates the properties and properties of properties this creates a circular structure now since 'node.next' is pointing to itself

Как вы справляетесь с этим сейчас? Javascript позволяет исправить это с помощью альтернативного

// Method toJSON can be added to any Javascript object so this will be invoked by Javascript Engine when you run JSON.stringify against the object
node.toJSON = function() {
    return {
        firstName: this.firstName,
        lastName: this.lastName,
        fullName: this.fullName(),
        address: {
            street: this.address.street,
            city: this.address.city
        }
    };
}
// Rerun the stringify function you will see the expected output with no error
JSON.stringify(node);
// Output
"{"firstName":"John","lastName":"Doe","fullName":"John Doe","address":{"street":"Buffalo Street","city":"NewYork"}}"

Теперь вы можете добавлять любые динамические типы, такие как ссылки, методы и другие функции по мере необходимости. Функциональная часть, которую JSON не может обработать Javascript, позволяет исправить это с помощью метода toJSON. Это не мода любить все подряд. Javascript позволит вам выразить свою любовь желаниями.