задний план
Сегодня служба контроля качества снова обнаружила меня: вчера эта страница была в порядке, но сегодня экран пуст. Что-то не так с вашим кодом? Поторопитесь и посмотрите.
Посмотрите и найдите причину:
оригинальный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, чтобы увидеть документацию.
На сегодня это все, надеюсь всех вдохновил.