Пример для начинающих
Если вы пытаетесь получить доступ к «user.name», но тогда это происходит:
Uncaught TypeError: Cannot read property 'name' of undefined
Не бойся. Вы можете решить эту проблему, используя оператор && в назначении или часто называемый защитный оператор , поскольку он "защищает" от возникновения неопределенной ошибки.
Вот несколько примеров, которые вы можете найти странными, но продолжайте читать, как это будет объяснено позже.
var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined
user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'
user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined
Пояснение : В операции охраны каждый член оценивается слева направо по одному . Если оцененное значение является ложным, оценка останавливается, и это значение затем присваивается. Если достигнут последний элемент, ему присваивается, является ли он ложным.
ложь означает, что это любое из этих значений undefined, false, 0, null, NaN, ''
и истина просто означает НЕ ложь.
Простая кнопка для метода охраны
Используйте прекрасный оператор lodash для доступа к вложенным данным, например:
// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');
, так как он обрабатывает содержимое && под капотом, и в то же время удобно использовать удобным способом. Lodash _.get исходный код
Бонус: оператор ИЛИ
Другое полезное странное назначение, которое используется на практике, - это оператор ИЛИ , который обычно используется для таких плагинов, как:
this.myWidget = this.myWidget || (function() {
// define widget
})();
, который присваивает часть кода, только если this.myWidget ложный. Это удобно, потому что вы можете объявить код где угодно и несколько раз, не заботясь о том, был ли он назначен или нет ранее, зная, что он будет назначен только один раз, так как люди, использующие плагин, могут случайно объявить ваш тег script src несколько раз.
Пояснение : Каждое значение оценивается от слева направо, по одному за раз . Если значение истинно, оно останавливает оценку и присваивает это значение, в противном случае продолжает работать, если достигнут последний элемент, оно назначается независимо от того, ложно оно или нет.
Дополнительные кредиты: Объединение && и || в назначении
Теперь у вас есть абсолютная сила, и вы можете делать очень странные вещи, такие как этот очень странный пример ее использования на палиндроме.
function palindrome(s,i) {
return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}
Подробное объяснение здесь: Проверка палиндрома в Javascript
Удачного кодирования.