Я знаю, что это очень старый вопрос, но я не на 100% доволен ни одним из ответов, поскольку все они кажутся неполными. Итак, мы снова вернемся к первым принципам:
Общая цель пользователя:
Обобщая код: «Я хочу добавить error
имя класса в строку, необязательно с начальным пробелом, если в строке уже есть имена классов».
Самое простое решение
Как указал Коби, 5 лет назад наличие ведущего пробела в именах классов не вызовет никаких проблем ни с одним из известных браузеров, поэтому кратчайшим правильным решением было бы на самом деле:
h.className += ' error';
Это должно было быть фактическим ответом на настоящую проблему .
Как бы то ни было, задаваемые вопросы были ...
1) Почему это сработало?
h.className += h.className ? ' error' : 'error'
Условный / тройная оператор работает как если утверждение, что присваивает результат его true
или false
путей к переменной.
Итак, этот код работал, потому что он оценивается просто как:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) а почему это сломалось?
h.className = h.className + h.className ? ' error' : 'error'
Вопрос гласит: «Это вызывает ошибку [n] в моей консоли», что может ввести вас в заблуждение, заставив думать, что код не работает . Фактически, следующий код выполняется без ошибок , но он просто возвращает «error», если строка не была пустой, и «error», если строка была пустой и поэтому не соответствовала требованиям .
Этот код всегда приводит к строке, которая содержит только этот псевдокод ' error'
или 'error'
потому, что он оценивает его:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
Причина этого в том, что оператор сложения ( +
к простому народу) имеет более высокий «приоритет» (6), чем условный / тернарный оператор (15). Я знаю, что числа идут наоборот
Приоритет просто означает, что каждый тип оператора на языке оценивается в определенном заранее определенном порядке (а не только слева направо).
Как изменить порядок оценки:
Теперь мы знаем, почему он не работает, и вам нужно знать, как заставить его работать.
В некоторых других ответах говорится об изменении приоритета , но вы не можете . Приоритет встроен в язык. Это всего лишь фиксированный набор правил ... Однако вы можете изменить порядок оценки ...
Инструмент в нашем наборе инструментов, который может изменить порядок оценки, - это оператор группировки (он же скобки). Это достигается за счет того, что выражения в квадратных скобках оцениваются перед операциями вне скобок. Это все, что они делают, но этого достаточно.
Скобки работают просто потому, что они (операторы группировки) имеют более высокий приоритет, чем все другие операторы («теперь уровень 0»).
Просто добавляя скобки, вы изменяете порядок оценки, чтобы сначала выполнялась условная проверка, перед простой конкатенацией строк:
h.className = h.className + (h.className ? ' error' : 'error')
Теперь я оставлю этот ответ незаметной ржавчине среди других :)
h.className += ' error'
, он также оставляет пустое место в начале строки, если она изначально была пуста. Я считаю, что цель тернарной операции - создать чистую строку.