Тема: JavaScript: Что за конструкция?
Уважаемые, в коде чужом встретил такой код:
function L(a,b,c) {
!c&&F(a); // wtf?
...
}
!c&&F(a) - что это, кто это, как это? 8|
Замечу, что в коде далее присутствует функция F(a).
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Уважаемые, в коде чужом встретил такой код:
function L(a,b,c) {
!c&&F(a); // wtf?
...
}
!c&&F(a) - что это, кто это, как это? 8|
Замечу, что в коде далее присутствует функция F(a).
Вызов функции F, если в переменной c - "пустое" значение (undefined, null, false, 0, NaN, ""). Конкретность "пустого" значения надо определять в зависимости от задачи.
Легко трансформируется в более понятный код:
if ( ! c ) {
F(a);
}
А где можно прочесть про такую хитрость? Не встречал ранее.
Есть например условие:
if (!c) F(a) else B(a)
Его возможно записать так:
!c?F(a);B(a)
Правильно?
А если
if (!c) F(a)
То есть без "else", могу ли я писать так:
!c?F(a)
Или как раз в случае отсутствия "else" нужно использовать
!c&&F(a)
Разобрался.
Оператор || возвращает свой второй аргумент, если первый оказался «ложным» (false, null, "", 0), и первый — в противном случае. Оператор && возвращает свой второй аргумент, если первый оказался истинным, и первый — если ложным.
О как!
где можно прочесть про такую хитрость?
Про хитрости, честно - не знаю. А в целом, почитайте про определения операций && ||.
Лично я избегаю использовать такие хитрости. Возможно они и сокращают код, но иногда вызывают трудности чтения.
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)
Rumata, благодарю, теперь я в теме.
Лично я избегаю использовать такие хитрости. Возможно они и сокращают код, но иногда вызывают трудности чтения.
Я тут недавно приобщился к JavaScript, считаю пока что себя начинающим, и по изучаемой книженции тоже встретился с подобным синтаксисом, ладно строчкой ниже всё было разложено по полочкам, но на начальном этапе запоминать не стал, ибо синтаксис из спецсимволов считаю обфускацией и трудности в чтении дарит не шуточные...
Лично я избегаю использовать такие хитрости. Возможно они и сокращают код, но иногда вызывают трудности чтения.
Более того, он может и не работать в некоторых языках, например в сях компилятор может вычислять значение логического выражения в любом порядке. Не знаком со спецификацией JS, но не уверен, что там прописан порядок вычисления логических выражений.
не уверен, что там прописан порядок вычисления логических выражений
Это был бы неполноценный язык, если бы такая вещь в нем не была бы прописана.
Operator Precedence на сайте mozilla
Operator Precedence на сайте msdn
Это был бы неполноценный язык, если бы такая вещь в нем не была бы прописана.
Operator Precedence на сайте mozilla
Operator Precedence на сайте msdn
Однако по этим ссылкам я сабжа не увидел. На MSDN только приоритет операторов, у мозилы указан порядок выполнения ассоциативных операторов, но не гарантируется, что в выражении f1(x)&&f2(x):
1) если результат ясен после вычисления одного операнда, то другой не будет вычислен.
2) f1 выполнится раньше f2.
JavaScript - ленивый язык, поэтому если в конструкции
x && y
выражение x == false, то выражение y не вычисляется. Страница на сайте мозиллы дает ответ на вопрос 2.
Может быть это не очевидно, но это становится ясно, при чтении спецификации языка. Любого.
JavaScript - ленивый язык, поэтому если в конструкции
x && y
выражение x == false, то выражение y не вычисляется. Страница на сайте мозиллы дает ответ на вопрос 2.
Цитаты в студию. Рекомендую заглянуть в "ECMA-266", вот там есть ответы на оба вопроса, а тут нету.
Может быть это не очевидно, но это становится ясно, при чтении спецификации языка. Любого.
Можно подумать все читают спецификации всех языков с которыми они сталкивались... Наверно ещё и за новыми редакциями следят...
ECMA-266
Это то тут при чем?
Можно подумать
Вот наверно поэтому в интернетах так много гавна в коде. Потому что не то что спецификаций не читают, так и просто книг не читают, а форумы так и пестрят просьбами решить задачки на халяву.
Это оффтоп, и я не собираюсь его поддерживать.
Объяснения для школьников типа меня очень важны.. мы не всегда следим и знаем про обновления, нововведения и т.д. в этом скороменяющемся мире и .. никто нам уже не помощник, кроме поиска и гуру этого форума.. увы, краткость кода это не всегда сестра таланта, а зачастую сохранение в целом коммерческой жилы многие идут на хитрости - сжатие кода и т.д... все именно из-за жилы информации от которой ты можешь быть почти богом или простым просителем-невеждой в расшифровке, т.к. не смог просто понять и прочесть иероглифы и смысл... уфф. простите за оффтопик и мольбу НЕ быть БЕЗучастными в просьбах страждующих... если нужна помощь форуму посильную я смог бы оказать.. а значит и продлить ваше существование в этом виртуальном мире...
Насчет халявщиков.. тут можно много спорить и утверждать, но для этого есть правила форума.. в них почти все сказано.
Насыщенные ненужными строками коды могут появляться по разным причинам, но это отдельная тема для разговора.
Александр_ пишет:ECMA-266
Это то тут при чем?
Серьёзно? А что ты подразумевал под спецификацией JS в своих постах?
Александр_
А-а-а. Поняол. У Вас опечатка. Вы имели в виду ECMA-262. Русский перевод - http://javascript.ru/ecma
краткость кода это не всегда сестра таланта, а зачастую сохранение в целом коммерческой жилы многие идут на хитрости - сжатие кода и т.д...
А я вообще не понимаю - зачем многие вообще пишут в манере обфусцированного кода. Код пишут для компьютера, но пишут его люди и читают и сопровождают его люди, поэтому писать надо предельно ясно. Но не все это делают - таков уж мир. А необходимым ухищрениям достаточно подробной документации.
Александр_
А-а-а. Поняол. У Вас опечатка. Вы имели в виду ECMA-262. Русский перевод - http://javascript.ru/ecma
Действительно, прошу прощения.
Предлагаю обращаться друг к другу на "ты" .
JavaScript - ленивый язык, поэтому если в конструкции
Не ленивый, а правильный.
Какой смысл вычислять полностью, если первый же аргумент предполагает бессмысленность продолжения вычислений?
Лично я избегаю использовать такие хитрости
Я таких сокращений избегаю из-за возможной неоднозначности.
Более того, он может и не работать в некоторых языках
Это их проблемы, а здесь речь о JS.
Вот наверно поэтому в интернетах так много гавна в коде.
А зачем всем читать спецификации? это и не всем программистам получающих зарплату нужно, желательно, но не нужно.
А людям которым раз в жизни понадобился скриптик, тем более.
Насчет халявщиков.. тут можно много спорить и утверждать
Много, это не то слово.
А халявщики, да есть и такие, но не много.
Предлагаю обращаться друг к другу на "ты"
Александр_ я согласен, а то как в детском садике.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться