#javascript #json
#javascript #json
Вопрос:
Я хочу подтвердить поведение, которое я вижу в отношении этой ссылки, и возможность изменять ключи (а не только значения) в объекте с помощью функции восстановления.
Если я передаю свою функцию восстановления, используя function(key,value {…} в отличие от использования функции со стрелкой (key, value) => {…} , ссылка this, похоже, относится к восстанавливаемому объекту. Это верно и для подобъектов в JSON. Я вижу это в node.js 8.x на сервере, а в Chrome current — на клиенте.
Понятно, что если я передаю функцию как функцию со стрелкой, вызывающий контекст сохраняется.
Я полагаюсь на это, чтобы добавлять и удалять некоторые ключи при разборе JSON.
Могу ли я полагаться на это поведение?
var aTestStr = '{"prop1": "this is prop 1",'
'"prop2": {"prop2A": 25, "prop2B": 13, "prop2C": "This is 2-c"}'
'}';
var aTestObj = JSON.parse(aTestStr, function(key, value) {
//at this point, this refers to the object being revived
//E.g., when key == 'prop1', this is an object with prop1 and prop2
//when key == prop2B, this is an object with prop2A, prop2B and prop2C
//So is this code reliable?
if (key == this.prop2B) {
//Do something, add a prop to this:
this.prop2BDif = 100 - this.prop2B;
}
});
Комментарии:
1. Вам лучше изменить
value
key
, когда"prop2"
Ответ №1:
Да, это задокументировано: документация JSON.parse в MDN
Если указан восстановитель, значение, вычисленное путем синтаксического анализа, преобразуется перед возвращением. В частности, вычисленное значение и все его свойства (начиная с наиболее вложенных свойств и заканчивая самим исходным значением) индивидуально запускаются через средство восстановления. Затем она вызывается, при этом объект, содержащий свойство, обрабатывается как this , и с именем свойства в виде строки и значением свойства в качестве аргументов.