Почему не может быть операция ИЛИ "||" замените тернарный оператор "?:" в этом JavaScript-коде?

В браузере работает следующий код:

var event = event || window.event; 
var eTarget = event.target || event.srcElement; 
var eTargetId = eTarget.id;

Когда я меняю его на

var eTargetId = event.target ? event.target.id : event.srcElement.id;

он тоже работает.

Когда я меняю код на

var eTargetId = event.target.id || event.srcElement.id;

он не работает в IE 678. Я получаю следующую ошибку:

SCRIPT5007: ожидаемый объект.

Почему это происходит?

Ответы

Ответ 1

Не пытайтесь прочитать свойство, если вы не проверили базовое значение, это действительно объект, а не null.

Обычно можно было бы сделать

var eTargetId = event.target && event.target.id || event.srcElement.id;

Или, если возможно, что цель события не имеет идентификатора,

var eTargetId = event.target && event.target.id
                || event.srcElement && event.srcElement.id
                || "";

Ответ 2

Вероятно, это происходит потому, что event.target имеет значение null, но event - нет. Первые две попытки используют короткое замыкание, чтобы предотвратить дальнейшую оценку, если event.target имеет значение null.

Ответ 3

Оцените event, event.target и event.srElement сначала

var eTargetId = ((event = event || window.event) 
                && (eTargetId = event.target || event.srcElement)
                && eTargetId["id"]) || void 0;