Термінальний оператор Javascript порівняно з ||


17

Я раніше дивився на який-небудь код node.js, і помітив, що хлопець, який його написав, здавався перевагою наступного синтаксису:

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

Щодо того, що я вважаю більш стислим:

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

Мені було цікаво, чи справді друга форма є більш соціально прийнятним синтаксисом JavaScript, я бачив це в дикій природі більше разів, ніж тернальний оператор для цієї мети.

Я зауважу, що в першому прикладі він використовує подвійні рівні (а не потрійні рівні), а значить, він буде вважати "невизначеним" як нульовим, що зменшило б один вплив, про який я міг би подумати. Однак я читав у багатьох місцях, що == є досить злим оператором у JavaScript (JSLint дуже проти цього, IIRC).


2
Коментатори : коментарі призначені для пошуку роз'яснень, а не для розширеного обговорення. Якщо у вас є рішення, залиште відповідь. Якщо ваше рішення вже розміщено, будь ласка, підкажіть його. Якщо ви хочете обговорити це питання з іншими, скористайтеся чатом . Див . FAQ для отримання додаткової інформації.

Відповіді:


17

Оскільки цей код оцінюватиметься як "Значення за замовчуванням" кожного разу, коли ви переходите до 0, "", неправдивого чи іншого фальшивого значення.

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

Це може не прикусити вас до того, як ви користуєтеся цією функцією, але це поганий зразок, якого слід уникати, коли вам не важливо переходити в такі речі, як порожні рядки або 0 або булеві.


вам слід використовувати лише об'єкт нульового злиття на об'єкті, і якщо об’єкт визначений, це не працюватиме. За винятком, можливо, порожнього рядка.
Мальфіст

4
Нульове порівняння - хороший момент, який може бути зовсім несподіваним.
Ед Джеймс

1
+1 - саме ця проблема полягає в тому, чому Python (зрештою) додав синтаксис "x if y y z". Ця семантика для логічних операторів є досить поширеною, і ті ж загальні помилки, як правило, з'являються, коли ідіоми покладаються на них, щоб виконати роботу операторів умовного вибору.
Steve314

просто не забудьте поставити ваші конструкції в круглі дужки, якщо ви використовуєте їх разом із об'єднанням рядків, var txt = 'Hello, ' + (user_name||'User') + '!';то це спрацює, але без дужок - ви отримаєте undefined. jsfiddle.net/4mFAB/1
c69

7

Те, що вам справді потрібно, - це нульовий оператор злиття. Але, побачивши, що у JavaScript насправді немає, програмісти зазвичай використовують "||" стояти за це.

Однак обидва цілком розумні. Для тих, хто не розуміє, що таке нульовий оператор злиття, швидше за все, це зрозуміє і потрійний оператор.


Іншим пов'язаним оператором є оператор Icon, написаний IIRC "else". Це визнає особливий результат "відмови" від першого аргументу, а другий аргумент використовує в цьому випадку як альтернативу. Я хотів би побажати, щоб Pythons "x if y else z" був реалізований за допомогою двох окремих операторів - оператора двійкового твердження "if" та оператора, подібного до Icon, як "else" - причому ці два оператори можна використовувати незалежно. Однак Icon не підтримував цей стиль, натомість робив щось дивне з відносними операторами.
Steve314

@ Steve314: У Python є щось, що ви хотіли: окремий інший оператор [false-part, true-part]з окремим, якщо оператор [..][bool(condition)]об'єднаний [false-part, true-part][bool(condition)]. Якщо ви хочете ледачої поведінки, ви можете просто заграти справжню і хибну частину.
Лі Лі Раян

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.