2008-11-20

Нестандартное поведение стандартного оператора ||

Иногда при кросс браузерном программировании бывает нужно выбрать из двух или более переменных которые зависят от типа браузера. Например типичный пример - отслеживание событий мыши - в IE параметры события берутся из глобального объекта event а в Firefox и многих других браузерах event передается как формальный параметр в обработчик события. Поэтому необходимо выбирать тот или иной способ получения этого объекта в зависимости от того какой браузер.

Самое первое, что приходит на ум это использовать тернарный оператор "<condition>?<if true>:<if false>"

a.onclick = function(e){
  var ev = e?e:event;
  //далее работаем с ev
}

Сегодня мне предложили еще более короткую запись:

a.onclick = function(e){
  var ev = e||event;
  //далее как обычно
}

Все отлично, все логично, но почему это работает? В MSDN четко сказано что || оператор логический и возвращает он true или false в зависимости от входных параметров. Если параметры на входе не логические то приводятся к логическим, т.е. не должно так работать а работает.

Скорее всего операция || возвращает первый не ложный аргумент, причем возвращает по ссылке в чем нетрудно убедиться:

    var v1; //undefined
    var v2 = {};
    var result = v1 || v2;    
    alert(result===v2); //true

Интересно, такое поведение где нибудь документировано или это хак?

UPD: Оказыватся у Мозиллы все подробно на этот счет расписано:

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Logical_Operators

 

комментарии:

 
Атиух (анонимный пользователь) | 2008-11-20
Писать страницы под IE — всё равно, что писать книги, ориентируясь на восприятие мира больными синдромом Дауна ©.
max | 2008-11-20

Хотел было возразить, что большая часть посетителей этого блога - дауны, так нет все не так плохо - всего около двадцати процентов.

Но, думаю и их не нужно сбрасывать со счета - к тому же у меня посещаемость маленькая да и блог сугубо программерской направленности - следовательно и аудитория соответствующая, на попсовых порталах, думаю, картина прямо противоположная.

Атиух (анонимный пользователь) | 2008-11-20
Дауны не пользователи а их браузер. Впрочем, часто это совпадает.
Bomfunk (анонимный пользователь) | 2008-11-20
А написание страниц под IE теоретически привлекает больше даунов. Мне не хотелось бы, чтобы их количество увеличивалось ;)
max | 2008-11-20

Bomfunk, тебе не кажется, что называть разработчиков из Микрософт а также тех кто пользуется их продуктами даунами попадает под ч.1 ст.282 УК РФ (возбуждение ненависти либо вражды, а также унижение достоинства человека и группы лиц по признакам расы, национальности, отношения к религии, совершенные с использованием средств массовой информации)? Сейчас модно судить блоггеров по этой статье

Учитывая, что большинство линуксоидов - адепты религии Linux.

Атиух (анонимный пользователь) | 2008-11-21
> религии Linux.
OMG. А где церковь?
Bomfunk (анонимный пользователь) | 2008-11-21
Да, "религии Linux" — это интересно :D
Про статью.
Представляю себе человека, смотрящего в монитор и в слезах жалующегося в телефонную трубку. И вычисляющих нас милиционеров, которые внезапно врываются в наши дома и заламывают руки. :D
Даже если оно так и произойдёт — я готов и несу ответственность.

Для того чтобы каждый раз не представляться можно войти как зарегистрированный пользователь.

Имя*

разрешены только теги br, font, span, p, strong, u, p, blockquote, a, div, img - остальные будут безжалостно удаляться