задний план
Сегодня служба контроля качества снова обнаружила меня: вчера эта страница была в порядке, но сегодня экран пуст. Что-то не так с вашим кодом? Поторопитесь и посмотрите.
Посмотрите и найдите причину:
оригинальныйpickup
, dropoff
Если в двух полях нет данных, он должен вернуть{}
, теперь результатpickup
поле возвращеноnull
, и когда мы взяли значение, мы не стали защищать это место.
list: openApiOrderInfo.pickup.address_list,
Результат:脚本报错, 页面不可用。
Это также очень просто решить, или дать默认值
или используйте?.
Сделайте слой защиты.
После изменения попробуйте еще раз, все будет в порядке, и страница вернется в нормальное состояние.
Давайте поговорим об этом?.
Сегодня основное содержание:
- Что такое необязательный оператор цепочки (
?.
) - Как включить эту функцию
- необязательный оператор цепочки (
?.
) как это работает -
Heny
Опубликованная соответствующая информация - Суммировать
язык текста
необязательный оператор цепочки (?.
), все знакомы с ним, поэтому я кратко расскажу о нем здесь.
Что такое необязательный оператор цепочки (?.
)
необязательный оператор цепочки (?.
) позволяет считывать значения свойств, расположенных глубоко в цепочке связанных объектов, без необходимости явно проверять, что каждая ссылка в цепочке действительна.
Например, рассмотрим объект obj, который имеет вложенную структуру. Без дополнительной цепочки при поиске глубоко вложенного подсвойства вам необходимо проверить ссылки между ними, например:
let nestedProp = obj.first && obj.first.second;
Во избежание ошибок перед доступом к obj.first.second убедитесь, что значение obj.first не является ни нулевым, ни неопределенным.
Если вы просто напрямую обращаетесь к obj.first.second, не проверяя obj.first, может возникнуть ошибка.
С необязательным оператором цепочки (?.) больше нет необходимости явно проверять состояние obj.first перед доступом к obj.first.second, а затем использовать вычисление короткого замыкания для получения окончательного результата:
let nestedProp = obj.first?.second;
Это эквивалентно следующему выражению, но без фактического создания временной переменной:
let temp = obj.first;
let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second);
?.
Функция оператора аналогична.
цепной оператор, за исключением того, что:
в отношении нулевого (null
илиundefined
) на случай, если不会引起错误
, возвращаемое значение короткого замыкания этого выражения:undefined
.
При использовании с вызовом функции, если данная функция не существует, она возвращаетundefined
.
при попытке доступа可能不存在的对象属性
когда используешь可选链操作符
сделает выражение更短、更简明
.
Есть два момента, на которые мы должны обратить внимание:
- Если есть имя свойства, которое не является функцией, использование ?. все равно вызовет TypeError (x.y не является функцией).
let result = someInterface.customMethod?.();
Исключение, если сам someInterface имеет значение null или не определеноTypeError
все равно выкинут.
Если вы хотите разрешить someInterface также дляnull
илиundefined
, то нужно написать такsomeInterface?.customMethod?.()
- дополнительная цепочка
不能用于赋值
let object = {};
object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment
Как включить эту функцию
// install
npm install --save-dev @babel/plugin-proposal-optional-chaining
// babel config
{
"plugins": [
"@babel/plugin-proposal-optional-chaining" //可选链
"@babel/plugin-proposal-nullish-coalescing-operator", //双问号
]
}
необязательный оператор цепочки (?.
) как это работает
const a = {
b: 1
};
console.log(a?.b);
будет преобразовано в:
const a = {
b: 1
};
console.log(a === null ? void 0 : a.b);
Если иерархия глубже, для логирования создаются временные переменные:
const a = {
b: {
c: 1,
d: 2,
}
};
console.log(a?.b?.c)
будет преобразовано в:
var _a$b;
const a = {
b: {
c: 1,
d: 2
}
};
console.log(
a === null || a === void 0
? void 0
: (_a$b = a.b) === null || _a$b === void 0
? void 0
: _a$b.c
);
Heny
Опубликованная соответствующая информация
Хени в настоящее времяbabel
Ответственный за проект ранее опубликовал статью, в которой рассказывается о текущей дилемме Babel.
Ссылка на твит выше:Twitter.com/left_crawl/body…
Если вам интересно, вы можете пойти и посмотреть.
Суммировать
?.
Он очень удобен в использовании, но если его использовать неправильно, он также скроет проблемы, которые должны быть выявлены.
Поэтому обязательно знайте, что вы делаете, когда используете его.
?.
И младший брат по имени空值合并运算符(??)
, я не буду говорить это здесь, перейдите на MDN, чтобы увидеть документацию.
На сегодня это все, надеюсь всех вдохновил.