JavaScript. Подробное руководство, 6-е издание, стр. 65
<b>var len = book && book.subtitle && book.subtitle.length;</b>Чтобы понять, почему второе выражение позволяет предотвратить появление исключений
<b>ТуреЕrror</b><b>&&</b><b>null</b><b>undefined</b><b>ТуреЕrror</b>Попытки установить значение свойства для других значений не всегда оканчиваются успехом: некоторые свойства доступны только для чтения и не позволяют изменять их значения. Кроме того, некоторые объекты не позволяют добавлять в них новые свойства. Однако самое интересное, что подобные неудачи, как правило, не приводят к возбуждению исключения:
<b>// Свойства prototype встроенных конструкторов доступны только для чтения.</b><b>Object.prototype = 0; // Присваивание не возбудит исключения;</b><b> // значение Object.prototype не изменится</b>Этот исторически сложившийся недостаток JavaScript исправлен в строгом режиме, определяемом стандартом ECMAScript 5. Все неудачные попытки изменить значение свойства в строгом режиме приводят к исключению
<b>ТуреЕrror</b>Правила, позволяющие определить, когда попытка выполнить операцию присваивания завершится успехом, а когда неудачей, просты и понятны, но их сложно выразить в достаточно краткой форме. Попытка присвоить значение свойству р объекта о потерпит неудачу в следующих случаях:
• Объект
<b>о</b><b>р</b><b>defineProperty(),</b>• Объект
<b>о</b><b>р</b>• Объект
<b>о</b><b>р</b><b>о</b><b>р</b><b>extensible</b><b>о</b><b>false</b><b>р</b><b>о</b><b>р</b><b>о</b><b>о</b>6.3. Удаление свойств
Оператор
<b>delete</b><b>delete</b><b>delete book.author; // Теперь объект book не имеет свойства author,</b><b>delete book["main title"]; // Теперь он не имеет свойства "main title".</b>Оператор
<b>delete</b>Выражение
<b>delete</b><b>true</b><b>delete</b><b>true</b><b>о = {х:1}; //о имеет собственное свойство х и наследует toString</b><b>delete о.х; // Удалит х и вернет true</b><b>delete о.х; // Ничего не сделает (х не существует) и вернет true</b><b>delete о.toString; // Ничего не сделает (toString не собственное свойство) и вернет true</b><b>delete 1; // Бессмысленно, но вернет true</b>Оператор
<b>delete</b><b>configurable</b><b>false</b><b>Type Error</b><b>delete</b><b>false</b><b>delete Object.prototype; // Удаление невозможно - ненастраиваемое свойство</b><b>var х = 1; // Объявление глобальной переменной</b><b>delete this.x; // Это свойство нельзя удалить</b><b>function f() {} // Объявление глобальной функции</b>