Если вы пытаетесь получить доступ к «user.name», но тогда это происходит:
Uncaught TypeError: Cannot read property 'name' of undefined
Не бойтесь. Вы можете решить это, используя & amp; & amp; оператор в задании или часто называемый сторожевым оператором, так как он «защищает» от неопределенной ошибки.
Вот несколько примеров, которые вы можете найти нечетными, но продолжайте читать, как объясняется позже.
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, ''
, а правда просто означает НЕ ложь.
Легкая кнопка для метода Guard
Используйте прекрасный защитный оператор lodash для доступа к вложенным данным следующим образом:
// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');
, поскольку он обрабатывает & amp; & amp; & amp; & amp; материал под капотом, будучи приятным в использовании удобным способом. Исходный код Lodash _.get
Другим полезным странным назначением, которое в практическом использовании, является оператор OR, который обычно используется для таких плагинов:
this.myWidget = this.myWidget || (function() {
// define widget
})();
, который будет назначать только часть кода, если «this.myWidget» является ложным. Это удобно, потому что вы можете объявлять код в любом месте и несколько раз, не заботясь о том, был ли он назначен или нет ранее, зная, что он будет назначен только один раз, поскольку люди, использующие плагин, могут несколько раз объявлять ваш скриптовый тег src несколько раз.
Объяснение: Каждое значение оценивается слева направо, по одному за раз. Если значение является правдивым, оно прекращает оценку и присваивает это значение, в противном случае продолжает движение, если последний элемент достигнут, он присваивается независимо от того, является ли он ложным или нет.
Теперь у вас есть максимальная сила и вы можете делать очень странные вещи, такие как этот очень странный пример использования его в палиндроме.
function palindrome(s,i) {
return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}
Подробное объяснение здесь: Проверка палиндрома в Javascript
Счастливое кодирование.
Возможно, что Вы могли реализовать это более устойчивым и доступным способом при помощи элемента маркировки для обертывания области, которую Вы хотите нажать.
, Например:
<label for="cb">
<div style="padding: 2em; border: 1px solid">
<input name="cb" id="cb" type="checkbox">
</div>
</label>
я не протестировал вышеупомянутый код, но я полагаю, что все нажатие поддержки браузеров маркировок проверяет поле ввода.
onclick="if (event.target.tagName != 'INPUT') document.getElementById('cb').checked = !document.getElementById('cb').checked"
Корень проблемы - то, что при нажатии на флажок событие щелчка распространено DOM к родительским элементам.
, Таким образом, флажок обрабатывает событие щелчка путем переключения себя, и затем DIV получает событие щелчка и переключает флажок снова.
простое решение состояло бы в том, чтобы остановить распространение события путем добавления этого к входному элементу:
onClick="event.stopPropagation();"
, В то время как это определяется в Модели событий Уровня 2 W3C DOM, она не может поддерживаться во всех браузерах, таким образом, можно хотеть пользоваться библиотекой перекрестного браузера как Прототип или jQuery для обеспечения совместимости.
изучите использование jQuery вместо того, чтобы программировать против dom сами. пользование библиотекой как jQuery означает, что Ваш код, более вероятно, будет работать над большинством браузеров