О фишке ( ? : ), ибо об этом крайне редко пишут в инете. Для тех, кто не знает
Знание этого способа делает код
- Красивее
- Быстрее
- Меньше
И так, вариант:
var x = ( a == 1 ? b : c )
Идентичен:
if (a ==1) { x = b } else { x = c; }
Т.е. праивло ( ? : ) всегда должно возвращать одно из ДВУХ значений:
Если условие до "?" верное, то вернуть значение сразу после него.
Если же условие ложно, то вернуть значение после знака ":".
ВНИМАНИЕ! Оно должно именно ВОЗВРАЩАТЬ значение, как функция.
Другими словами вариант ( a==1 ? b=2 : b=3 ) (т.е. если а = 1, присвой b=2, иначе присвой b=3) не сработает.
Правильно: var b = (a==1?2:3);
ОООЧЕНЬ удобно в форматирование текста, к примеру:
var text = 'Hello '+(name?name:'Stranger')+'! How are you today?'
или проверки на undefined значений:
var url = 'send.php?var1='+(typeof var1 == undefined?0:var1);)
Если этого не сделать, и вар1 не определено, то отправится
send.php?var1=undefined
что КРАЙНЕ не желательно
// Саша
Другими словами вариант ( a==1 ? b=2 : b=3 ) (т.е. если а = 1, присвой b=2, иначе присвой b=3) не сработает.
Даже в случае JavaScript это неверное утверждение. Для тернарного оператора "a?b:c" b и c должны быть выражениями, а присваивание в JavaScript (a=b) так же является выражением, так что следующие два предложения будут иметь одинаковые последствия:
a == 1 ? b=2 : b=3;
Другое дело, что "var a" это уже предложение, а не выражение, и код "a == 1 ? var b = 2 : var b = 3" синтаксически неверен. Но следующие две строки кода, опять же, будут иметь одни и теже последствия:
var b; a == 1 ? b=2 : b=3;
var url = 'send.php?var1='+(var1?var1:0)
Если этого не сделать, и вар1 не определено, то отправится
send.php?var1=undefined
что КРАЙНЕ не желательно ...
Если var1 не определено, то этот код сгенерирует ошибку и выполнение содержащего его скрипта на этом закончится. Правильнее так:
var b; a == 1 ? b=2 : b=3;
Супер круто! В Perl (вроде) подобный трюк не проходил... Хоть я больше ссылался на то, что такие выражения точно не пройдут:
Да конечно верно. Тут я описался. Я обычно так проверяю ключи массивов, которые конечно определены.
Хоть и у вас маленькая опечаточка:
Огромное спасибо за исправления Shiizoo ! Я уверен что многие вынесут много полезного из сего топика. :)
А они (предложения) не пройдут все по той же причине: "b=2;c=2" - не выражение. Но вот так сработает, конечно:
Жизнь моя жестянка... Работает! =) Век живи, век учись =)
Одна из элементарнейших и древних конструкций любого C-подобного языка, можно сказать основы. А тут прям откровение. )
Одна из элементарнейших и древних конструкций любого C-подобного языка, можно сказать основы. А тут прям откровение. )
В свое время для меня было откровением... И это не так уж странно, особенно для тех, кто свое знакомство с программированием начинает изучать с Visual Basic, а потом ныряет в пучину Web... Я всегда знал о существовании подобного "оператора", но нигде не мог найти документации, не знаю его названия. А поиск в Гугле по символам ( ? : ), сам понимаешь, результата не принесет. Я программирую уже почти 12 лет, а вот "тернарным оператором" научился пользоваться всего пол года как? По книжке? По статье? Нет - методом тыка.
Так что "откровение" - да это очень верное слово в данной концепции. И оно позволило мне узнать сегодня много нового.
Дык ктож в гугле то такое ищет? Спецификация языка же есть. Там все операторы расписаны.
А так рад конечно за вас, что открываете новые возможности в известной технологии. =)
... А кстати не так уж все и просто... Сколько книг в детстве не перечитал, а упоминание о "альтернативе оператору if" было только в толстенном фиолетовом томе по Perl.. И то без разъяснений. В других книгах (которые у меня были), так вообще про него не говорилось. Это конечно не спецификация языка, но и не с нее начинающие программисты погружаются в пучину таинства программирования: не самое веселое чтиво однако. И кстати в универе у нас тоже о нем не упоминали (хоть я мог и пропустить)... в общем как факт: за 12 лет я "случайно" не наткнулся ни на одно описание тернарного оператора.. Видимо это просто я такой везунчик =))
Это я к тому веду, что данный топик может и не настолько бесполезен как кажется.
Если условие до "?" верное, то вернуть значение сразу после него.
Если же условие ложно, то вернуть значение после знака ":"
Уже можно не так строго:
- http://pt.php.net/manual/ru/language.operators.comparison.php#language.operators.comparison.ternary
Похоже на то. Я честно говоря не представляю как за 12 лет можно не наткнуться на него. =)
А мне, вроде как, UAS показал его. :D Либо Тень Пса.
Вообще, по своему опыту, я заметил, что данную структуру как раз не знают бывшые паскальщики и Basic-программисты. Я этот оператор вообще выучил в первые полгода программирования)
Однако,после начала изучения «Си-подобных языков»:) быстро с ним столкнулся и воспользовался.Да,штука очень удобная для использования в выражениях.Правда,если требуется выполнить больше одного действия или это действие–не присваивание,удобство оной резко падает…
Вообще, по своему опыту, я заметил, что данную структуру как раз не знают бывшые паскальщики и Basic-программисты. Я этот оператор вообще выучил в первые полгода программирования)
Ну а я - в первые полгода программирования на PHP. Собсно, с чего бы мне было его знать в паскале, коли там его нет.