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 позволит вам выразить свою любовь желаниями.