Я знаю, що це дуже старе питання, але я не на 100% задоволений жодною з відповідей, оскільки всі вони здаються неповними. Отже, ми знову переходимо від перших принципів:
Загальна мета користувача:
Підсумовуючи код: "Я хочу додати error
ім'я класу до рядка, необов'язково з провідним пробілом, якщо в рядку вже є імена класів."
Найпростіше рішення
Як зазначав Кобі, 5 років тому наявність провідних місць у назвах класів не спричинить жодних відомих браузерів, тому найкоротшим правильним рішенням було б:
h.className += ' error';
Це мала бути фактичною відповіддю на справжню проблему .
Як би там не було, запитання були ...
1) Чому це спрацювало?
h.className += h.className ? ' error' : 'error'
Умовний / потрійний оператор працює як оператор if, який присвоює результат своєї змінної 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'
тому, що він оцінює цей псевдо-код:
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'
, він також залишає порожнє місце на початку рядка, якщо він спочатку був порожнім. Я вважаю, що сенсом потрійної операції є створення чистого вигляду струни.