1 (изменено: DnsIs, 2011-09-30 12:34:53)

Тема: JavaScript: Что за конструкция?

Уважаемые, в коде чужом встретил такой код:

function L(a,b,c) {
 !c&&F(a); // wtf?
...
}

!c&&F(a) - что это, кто это, как это? 8|

Замечу, что в коде далее присутствует функция F(a).

Нас невозможно сбить с пути, нам пофигу куда идти.

2

Re: JavaScript: Что за конструкция?

Вызов функции F, если в переменной c - "пустое" значение (undefined, null, false, 0, NaN, ""). Конкретность "пустого" значения надо определять в зависимости от задачи.

Легко трансформируется в более понятный код:


if ( ! c ) {
    F(a);
}
( 2 * b ) || ! ( 2 * b )

3 (изменено: DnsIs, 2011-09-30 13:00:58)

Re: JavaScript: Что за конструкция?

А где можно прочесть про такую хитрость? Не встречал ранее.

Есть например условие:

if (!c) F(a) else B(a)

Его возможно записать так:

!c?F(a);B(a)

Правильно?
А если

if (!c) F(a)

То есть без "else", могу ли я писать так:

!c?F(a)

Или как раз в случае отсутствия "else" нужно использовать

!c&&F(a)
Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: JavaScript: Что за конструкция?

Разобрался.

Оператор || возвращает свой второй аргумент, если первый оказался «ложным» (false, null, "", 0), и первый — в противном случае. Оператор && возвращает свой второй аргумент, если первый оказался истинным, и первый — если ложным.

О как!

Нас невозможно сбить с пути, нам пофигу куда идти.

5

Re: JavaScript: Что за конструкция?

где можно прочесть про такую хитрость?

Про хитрости, честно - не знаю. А в целом, почитайте про определения операций && ||.

Лично я избегаю использовать такие хитрости. Возможно они и сокращают код, но иногда вызывают трудности чтения.
if then else

if ( c ) F(x) else G(x)

Это тернарный оператор и всегда содержит три операнда
c ? F(x) : G(x)

c && F(x) || G(x)

if then

if ( c ) F(x)

c && F(x)
( 2 * b ) || ! ( 2 * b )

6

Re: JavaScript: Что за конструкция?

Rumata, благодарю, теперь я в теме.

Нас невозможно сбить с пути, нам пофигу куда идти.

7 (изменено: Евген, 2012-02-10 19:19:25)

Re: JavaScript: Что за конструкция?

Rumata пишет:

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

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

Времени не хватает... :-(

8

Re: JavaScript: Что за конструкция?

Rumata пишет:

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

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

9

Re: JavaScript: Что за конструкция?

Александр_ пишет:

не уверен, что там прописан порядок вычисления логических выражений

Это был бы неполноценный язык, если бы такая вещь в нем не была бы прописана.

Operator Precedence на сайте mozilla
Operator Precedence на сайте msdn

( 2 * b ) || ! ( 2 * b )

10

Re: JavaScript: Что за конструкция?

Rumata пишет:

Это был бы неполноценный язык, если бы такая вещь в нем не была бы прописана.

Operator Precedence на сайте mozilla
Operator Precedence на сайте msdn

Однако по этим ссылкам я сабжа не увидел. На MSDN только приоритет операторов, у мозилы указан порядок выполнения ассоциативных операторов, но не гарантируется, что в выражении f1(x)&&f2(x):
1) если результат ясен после вычисления одного операнда, то другой не будет вычислен.
2) f1 выполнится раньше f2.

11 (изменено: Rumata, 2012-02-11 12:11:00)

Re: JavaScript: Что за конструкция?

JavaScript - ленивый язык, поэтому если в конструкции

x && y

выражение x == false, то выражение y не вычисляется. Страница на сайте мозиллы дает ответ на вопрос 2.

Может быть это не очевидно, но это становится ясно, при чтении спецификации языка. Любого.

( 2 * b ) || ! ( 2 * b )

12

Re: JavaScript: Что за конструкция?

Rumata пишет:

JavaScript - ленивый язык, поэтому если в конструкции

x && y

выражение x == false, то выражение y не вычисляется. Страница на сайте мозиллы дает ответ на вопрос 2.

Цитаты в студию. Рекомендую заглянуть в "ECMA-266", вот там есть ответы на оба вопроса, а тут нету.

Rumata пишет:

Может быть это не очевидно, но это становится ясно, при чтении спецификации языка. Любого.

Можно подумать все читают спецификации всех языков с которыми они сталкивались... Наверно ещё и за новыми редакциями следят...

13 (изменено: Rumata, 2012-02-11 13:47:23)

Re: JavaScript: Что за конструкция?

Александр_ пишет:

ECMA-266

Это то тут при чем?

Александр_ пишет:

Можно подумать

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

Это оффтоп, и я не собираюсь его поддерживать.

( 2 * b ) || ! ( 2 * b )

14

Re: JavaScript: Что за конструкция?

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

Любители построили Ковчег, а профессионалы - Титаник.

15

Re: JavaScript: Что за конструкция?

Rumata пишет:
Александр_ пишет:

ECMA-266

Это то тут при чем?

Серьёзно? А что ты подразумевал под спецификацией JS в своих постах?

16

Re: JavaScript: Что за конструкция?

Александр_
А-а-а. Поняол. У Вас опечатка. Вы имели в виду ECMA-262. Русский перевод - http://javascript.ru/ecma

stir пишет:

краткость кода это не всегда сестра таланта, а зачастую сохранение в целом коммерческой жилы многие идут на хитрости - сжатие кода и т.д...

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

( 2 * b ) || ! ( 2 * b )

17

Re: JavaScript: Что за конструкция?

Rumata пишет:

Александр_
А-а-а. Поняол. У Вас опечатка. Вы имели в виду ECMA-262. Русский перевод - http://javascript.ru/ecma

Действительно, прошу прощения.
Предлагаю обращаться друг к другу на "ты" .

18

Re: JavaScript: Что за конструкция?

JavaScript - ленивый язык, поэтому если в конструкции

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

Лично я избегаю использовать такие хитрости

Я таких сокращений избегаю из-за возможной неоднозначности.

Более того, он может и не работать в некоторых языках

Это их проблемы, а здесь речь о JS.

Вот наверно поэтому в интернетах так много гавна в коде.

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

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

Много, это не то слово.
А халявщики, да есть и такие, но не много.


Предлагаю обращаться друг к другу на "ты"

Александр_ я согласен, а то как в детском садике.