Приоритет оператора с Тернарным оператором JavaScript

Добавьте ссылку на System.Data.DataSetExtensions, который добавляет поддержку Linq запросов таблиц данных.

Это было бы чем-то как:

string value = (
    from row in ds.Tables[0].Rows
    select row.Field<string>(0) ).FirstOrDefault();
116
задан Boaz 28 July 2013 в 06:21
поделиться

5 ответов

h.className = h.className + (h.className ? ' error' : 'error')

Вы хотите, чтобы оператор работал для h.className , лучше уточнить это.
Конечно, h.className + = 'error' не должно причинить вреда, но это другой вопрос.

Также обратите внимание, что + имеет приоритет над тернарным оператором: Приоритет операторов JavaScript

141
ответ дан 24 November 2019 в 02:12
поделиться

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

<variable> = <expression> ? <true clause> : <false clause>

Оператор выполняется в основном следующим образом:

  1. Выполняется ли <выражение> как истинное или ложное?
  2. Если <выражение> оценивается как истинное, то значение <предложение истина> назначается <переменная> , <предложение false> игнорируется, и выполняется следующий оператор.
  3. Если <выражение> оценивается значение false, то <предложение true> игнорируется, а значение <предложение false> присваивается .

С тернарным оператором в этом и других языках важно понимать, что любой код в должен давать логический результат при оценке: либо true, либо false.

В вашем примере замените «назначено» в моем объяснении на «добавлено в» или аналогично для любой сокращенной арифметики, которую вы используете, если таковая имеется.

129
ответ дан 24 November 2019 в 02:12
поделиться

+ = делает то, что вы хотите, но в тернарном выражении справа от него проверяет, является ли h.className ложным , что было бы, если бы оно не было определено. Если это правда (т.е. если имя класса уже указано), тогда ошибка добавляется с пробелом (т.е. добавляется новый класс), в противном случае она добавляется без пробела.

Код может быть переписан как вы предлагаете, но вам нужно указать, что h.className должен использоваться для сравнения истинности, а не для использования его фактического значения в тернарном операторе, поэтому убедитесь, что вы не беспокоитесь о объединение значений одновременно с выполнением вашей тернарной операции:

h.className = h.className + (h.className ? ' error' : 'error');
10
ответ дан 24 November 2019 в 02:12
поделиться

Правая часть оператора = вычисляется слева направо. Итак,

g.className = h.className + h.className ? ' error' : 'error';`

эквивалентно

h.className = (h.className + h.className) ? ' error' : 'error';

Чтобы быть эквивалентным

h.className += h.className ? ' error' : 'error';

, вы должны разделить троичный оператор в скобках

h.className = h.className + (h.className ? ' error' : 'error');
4
ответ дан 24 November 2019 в 02:12
поделиться
if (h.className) {
    h.className = h.className + ' error';
} else {
    h.className = h.className + 'error';
}

должен быть эквивалентом:

h.className += h.className ? ' error' : 'error';
3
ответ дан 24 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: