Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   логические операторы (https://javascript.ru/forum/misc/11361-logicheskie-operatory.html)

yngwie19 19.08.2010 21:05

логические операторы
 
Доброго времени суток. Есть пара вопросов по логическому оператору &&.
В одной книге по JS прочитал, что при если
false && stop()

в этом выражении первый аргумент является false, null или undefine, то срабатывает второй оператор, т.е функция stop(). А здесь на сайте в разделе "Логические операторы" написано, что это выражение вернет первый не верный операнд. Подскажите чего я не понимаю?

inGray 19.08.2010 21:07

В больштнстве языков такая конструкция вернет false всегда, согласно правилам матлогики. Ни к чему проверять второе условие, если первое всегда ложно... их произведение всегда ложь.
ЗЫ. Можете поэксперементировать ;)

<script type='text/javascript'>
alert(false && function(){return true;}) //вернет false
alert(null && function(){return true;}) //вернет null
alert(b && function(){return true;}) //ничего не вернет
</script>

yngwie19 19.08.2010 22:39

alert(b && function(){return true;}) //ничего не вернет

а почему в этом примере ничего не вернет?

B@rmaley.e><e 19.08.2010 22:41

Цитата:

Сообщение от yngwie19
false && stop()

В этом случае функция stop даже вызвана не будет.
false && function(){alert('O_o'); return true}(); alert('Ничего не произошло');

yngwie19 20.08.2010 08:07

т.е получается, что если если первый аргумент false - то он и возвращается, а если оба true, то возвращается последний ?

B~Vladi 20.08.2010 08:12

Цитата:

Сообщение от yngwie19
В одной книге по JS прочитал

Цитата:

Сообщение от yngwie19
в этом выражении первый аргумент является false, null или undefine, то срабатывает второй оператор, т.е функция stop()

Скорей сожги книгу.
Цитата:

Сообщение от yngwie19
если если первый аргумент false - то он и возвращается, а если оба true, то возвращается последний ?

Да. Ты же не ожидаешь, что проверка
if(false && true){}

пройдет?

inGray 20.08.2010 11:04

Цитата:

Сообщение от yngwie19 (Сообщение 67985)
alert(b && function(){return true;}) //ничего не вернет

а почему в этом примере ничего не вернет?

b - есть ничего.
Произведение ничего на что-то дает ничего.
Значит функция вернет ничего)

B~Vladi 20.08.2010 12:03

Цитата:

Сообщение от inGray
alert(b && function(){return true;}) //ничего не вернет

Этот пример упадет с ошибкой: b - is not defined. Не морочьте людям головы.

inGray 20.08.2010 12:50

:) Я предложил на первом шаге поэкперементировать... В результате эксперимента выдаст ошибку ;)

haha 20.08.2010 17:59

просто интересно
 
Сей пост дернул за одну мысль.
condition1 &&
(action1() || 1)//предохраняем от "лжи"
||condition2 &&(
    subcondition2_1 && (action2_1() || 1) ||
    subcondition2_2 && (action2_2() || 1)
)||
condition3 && action3() ||//пусть action3 всегда вернет true
action4()

Несмотря на некую нездоровость, такое ветвление работает, и были упразднены слова switch, case, if, else.
Идея не нова, и, может быть, кто-то здесь так пишет?

B~Vladi 20.08.2010 18:07

Хочешь сказать, что в итоге объем кода уменьшился?

В любом случае это трудно читать...

inGray 20.08.2010 18:19

Такой код дает мало возможностей для управления, имхо. Он фактически линеен?

e1f 20.08.2010 18:24

Цитата:

Сообщение от inGray (Сообщение 68108)
Такой код дает мало возможностей для управления, имхо. Он фактически линеен?

Нет, эт замена тому же if-else, switch-case. Замена очень плохо читаемая.

Где я такое могу использовать, это для замены одиночных if'ов:
foo && bar()


И для определение default значений переменных, поскольку в JS нет отличных перловых ||= и //=
foo || (foo = '%default%')

inGray 20.08.2010 18:32

Just interesting, какова сравнительная производительность этих двух подходов?

e1f 20.08.2010 18:39

Не знаю, не тестировал, ввиду того, что это экономия на спичках.

Gvozd 21.08.2010 02:46

Цитата:

Сообщение от inGray
Just interesting, какова сравнительная производительность этих двух подходов?

более важный фактор тут оформление кода, и качество/скорость/удобство разработки
при написании проектов более трех десятков строк, использование нестандартных конструкции резко ухудшит эти параметры.
и если выбирать между медленной, но работающей программой, которую я смогу исправить, и быстрой но не работающей, не меняющейся, не тестируемой и неочевидлной прогой. то раузмеется я выберу первое

B@rmaley.e><e 21.08.2010 10:00

haha, google closure compilier.

inGray 21.08.2010 10:52

B@rmaley.e><e,
Это видимо глюк форума? Сообщение из соседней ветки Лучший редактор под ubuntu

B@rmaley.e><e 21.08.2010 12:06

inGray, о чем Вы? Мое сообщение должно находиться именно здесь.

inGray 21.08.2010 12:59

B@rmaley.e><e,
:) Оно просто не очень понятное )

Имеете ввиду?
Цитата:

Сообщение от haha (Сообщение 68100)
Идея не нова, и, может быть, кто-то здесь так пишет?

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 68167)
haha, google closure compilier.


B@rmaley.e><e 21.08.2010 18:11

inGray,
Цитата:

Сообщение от haha
Идея не нова, и, может быть, кто-то здесь так пишет?

Я отвечал на этот вопрос.

haha 22.08.2010 13:20

Очевидно, никто так не пишет.
Но читабельность, думаю, понятие субъективное.
В пору изучения Паскаля подумать о передаче функций как параметров было чем-то невообразимым. Вчитываться в этот функциональный "беспредел" было сложно. А теперь это что-то обыкновенное. Я даже нашел подобное извращение на Паскале.
Ну а про запись программы через логические операторы, по мне, это из той же категории. Язык умеет, значит можно. Нужно только приноровиться.

Google Closure Compiler не копал, еще не дошел до той стадии джаваскриптерства, когда он нужен.

B@rmaley.e><e 22.08.2010 14:37

Цитата:

Сообщение от haha
Язык умеет, значит можно

goto тоже многие языки умеют.

Gvozd 22.08.2010 16:02

Цитата:

Сообщение от B@rmaley.e><e
goto тоже многие языки умеют.

не распинайся, он не оценит


Часовой пояс GMT +3, время: 15:15.