2012-04-25 3 views
87

Я использую JQuery 1.7.1JavaScript Пример троичного оператора с функциями

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

Вот оригинальное заявление:

function updateItem() { 
    $this = $(this); 
    var IsChecked = $this.hasClass("IsChecked"); 
    if (IsChecked == true){ 
     removeItem($this); 
    } else { 
     addItem($this); 
    } 
} 

Вот та же функция с трехзначным оператором:

function updateItem() { 
    $this = $(this); 
    var IsChecked = $this.hasClass("IsChecked"); 
    (IsChecked == true) ? removeItem($this) : addItem($this); 
} 

Я был удивлен тем, что все примеры, которые я видел, которые были использованы только настройки переменных, как это :

x = (1 < 2) ? true : false; 

Мой вопрос в том, является ли это «нормальным» использование и будет ли он работать в большинстве версий JavaScript? Где это произойдет? Существуют ли другие менее очевидные применения?

ОБНОВЛЕНИЕ - Спасибо за совет «настоящего мира» !!!

Я использую это как моя функция:

function updateItem() { 
    $this = $(this); 
    $this.hasClass("IsChecked") ? removeItem($this) : addItem($this); 
} 
+0

Это нормально, и он будет работать нормально .. В гене ral, удобочитаемость трудно использовать при использовании тернарных операторов, но в вашем случае это выглядит просто отлично. –

+1

Хм .... вы также можете это сделать, поскольку оба они принимают те же аргументы '(IsChecked? RemoveItem: addItem) ($ this)'. Однако, чтобы ответить на ваш вопрос, да, это нормально, и нет ничего плохого в использовании тернарных операторов, если они не умаляют ремонтопригодность или удобочитаемость в ситуации, когда это необходимо. http://jsfiddle.net/vsB3f/ –

+0

'if ($ this.hasClass (" IsChecked ")) removeItem ($ this); else addItem ($ this) 'является правильным способом. Тернарный оператор не предназначен для подобных случаев, но для таких вещей, как 'foo (isChecked? 'Bar': meow());' (т.е. когда вы заботитесь о «возвращаемом значении» того, что вы делаете в блоках then/else) – ThiefMaster

ответ

177

Он h, в вашем вопросе есть довольно интересные применения тройного синтаксиса; Мне нравится последний из лучших ...

x = (1 < 2) ? true : false; 

Использование троичной здесь полностью uncessesary - вы могли бы просто написать

x = (1 < 2); 

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

(IsChecked == true) ? removeItem($this) : addItem($this); 

Просто как:

(IsChecked) ? removeItem($this) : addItem($this); 

Infact, я хотел бы также удалить IsChecked временно, а что оставляет вас с:

($this.hasClass("IsChecked")) ? removeItem($this) : addItem($this); 

Что касается кастрированный баран это приемлемо синтаксис, он уверен! Это отличный способ сократить четыре строки кода в один, не влияя на читаемость. Единственное слово совета, которое я бы вам дал, - это избегать вложения нескольких тернарных заявлений на одну и ту же строку (таким образом, это безумие!)

+6

Это прекрасный пример того, что тернарный * хорошо. –

+3

Спасибо за совет ... и суточная доза сарказма. :) –

+0

Обратите внимание, что вы можете избежать использования верхних регистров в именах классов (IsChecked становится проверенным) http://stackoverflow.com/questions/1547986/can-i-use-camel-case-in-css-class -names –

6

Там нет ничего особенно сложно о примере вы публикуемую.

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

Подумайте об этом так:

var x = (1 < 2) ? true : false; 

Может быть записано как:

var x = (1 < 2) ? getTrueValue() : getFalseValue(); 

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

(1 < 2) ? getTrueValue() : getFalseValue(); 

Теперь просто заменить те, с любыми произвольными функциями, и вы осталось что-то, как ваш пример:

(1 < 2) ? removeItem($this) : addItem($this); 

Теперь ваш последний пример действительно не нуждается в трехкомпонентной вообще, как это можно записать так:

x = (1 < 2); // x will be set to "true" 
+0

Я не нахожу много использования тернарного оператора. Я не нахожу много примеров. Спасибо за разъяснения. –

18

Тройной стиль обычно используется для экономии места. Семантически они идентичны. Я предпочитаю использовать полный синтаксис if/then/else, потому что я не люблю жертвовать читабельностью - я старая школа, и я предпочитаю свои фигурные скобки.

Полный формат if/then/else используется для почти всего. Это особенно популярно, если вы попадаете в более крупные блоки кода в каждой ветви, у вас есть мути-разветвленное дерево if/else или несколько else/ifs в длинной строке.

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

Хорошие идеи:

this > that ? alert(this) : alert(that); //nice and short, little loss of meaning 

if(expression) //longer blocks but organized and can be grasped by humans 
{ 
    //35 lines of code here 
} 
else if (something_else) 
{ 
    //40 more lines here 
} 
else if (another_one) /etc, etc 
{ 
    ... 

Сносные:

this > that ? testFucntion() ? thirdFunction() ? imlost() : whathappuh() : lostinsyntax() : thisisprobablybrokennow() ? //I'm lost in my own (awful) example by now. 
//Not complete... or for average humans to read. 

if(this != that) //Ternary would be done by now 
{ 
    x = this; 
} 
else 
} 
    x = this + 2; 
} 

действительно основной правило - вы можете понять все это так же хорошо или лучше на одной линии? Тернар в порядке. В противном случае расширьте его.

+0

Отличные примеры и советы. Спасибо!!! –

+0

Я рад, что вы сочли это полезным. –

6

Если вы собираетесь гнездовых трехкомпонентных операторов, я полагаю, вы хотите сделать что-то вроде этого:

var audience = (countrycode == 'eu') ? 'audienceEU' : 
        (countrycode == 'jp') ? 'audienceJP' : 
        (countrycode == 'cn') ? 'audienceCN' : 
        'audienceUS'; 

Это намного эффективнее писать/читать, чем:

var audience = 'audienceUS'; 
if countrycode == 'eu' { 
    audience = 'audienceEU'; 
} else if countrycode == 'jp' { 
    audience = 'audienceJP'; 
} else if countrycode == 'cn' { 
    audience = 'audienceCN'; 
} 

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

+5

Категорически не согласен с приведенным выше замечанием о том, что вложенные троицы легче читать и отлаживать. Лично я предпочел бы, чтобы блок вложенного else/if заменен либо на [lookup table] (https://coderwall.com/p/6e7rea), либо на оператор switch. – JonnyReeves

+0

@ JonnyReeves согласился - обычно вложенный тройной синтаксис лучше всего использовать при проверке разных условий (например, [по модулю чисел] (http: // twistedoakstudios.ком/блог/Post5273_how читаемый вложенным-тройные-операторы)) – AlexFoxGill

2

Я знаю, на вопрос уже дан ответ.

Но позвольте мне добавить один пункт здесь. Это не только случай истинного или ложного.См. Ниже:

var val="Do"; 

Var c= (val == "Do" || val == "Done") 
      ? 7 
      : 0 

Здесь, если val - это Do или Done, тогда c будет 7 else, это будет ноль. В этом случае c будет 7.

Это на самом деле другая перспектива этого оператора.

3

Я также хотел бы добавить что-то от меня.

Другого возможный синтаксис для вызова функций с тройным оператором, будет:

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

(condition ? fn1 : fn2)(arg1, arg2, arg3, arg4, arg5); 

Вы можете использовать тройной оператор даже с именами функций-членов, которые лично мне очень нравится, чтобы сэкономить место:

$('.some-element')[showThisElement ? 'addClass' : 'removeClass']('visible'); 

или

$('.some-element')[(showThisElement ? 'add' : 'remove') + 'Class']('visible'); 

Другой пример:

var addToEnd = true; //or false 
var list = [1,2,3,4]; 
list[addToEnd ? 'push' : 'unshift'](5); 
Смежные вопросы