Попередній термінальний оператор Javascript


102

Я знаю, що в php 5.3 замість використання цього надлишкового синтаксису потрійного оператора:

startingNum = startingNum ? startingNum : 1

... ми можемо використовувати скорочений синтаксис для наших потрійних операторів, де застосовано:

startingNum = startingNum ?: 1

І я знаю про потрійного оператора в javascript:

startingNum = startingNum ? startingNum : 1

... але чи є стенограма?

Відповіді:


176
var startingNumber = startingNumber || 1;

Щось таке, що ви шукаєте, де це значення за замовчуванням, якщо не визначено?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

До речі, це працює для багатьох сценаріїв, включаючи об’єкти:

var foo = bar || {}; // secure an object is assigned when bar is absent

Справді, підстрибуючи сьогодні вранці. Виправлено, але дякую, що помітили.
Бред Крісті

1
Ви не маєте на увазі ||замість цього ???
Ракета Hazmat

2
Дякую! Ти впорався. Я фактично використовую об'єкт у цьому випадку. :)
Web_Designer

8
Для когось цікавого, це працює, тому що ||оператор JS не повертає істину чи хибність, він повертає перше значення "truthy". Скажіть, у вас є val0і val1як undefined, і val2є 2, val3є 3. val0 || val1 || val2 || val3повернеться 2, оскільки це перше значення "truthy".
Джейк Т.

2
Чи не ця ідіома є антизією? Що робити, якщо ви передасте 0 або порожній рядок, вираз "АБО" пропустить його і використовуватиме значення за замовчуванням, де ви дійсно хотіли 0 або порожній рядок.
Пол Тшина

24

|| поверне перше значення, яке воно зустрічає, і тому може бути використане як оператор злиття, подібний до C # ??

startingNum = startingNum || 1;

Мені подобається ваше пояснення більше, ніж інші
ajax333221

12

Так, є:

var startingNum = startingNum || 1;

Загалом, expr1 || expr2працює таким чином (як зазначено в документації ):

Повертається, expr1якщо його можна перетворити true; інакше повертається expr2. Таким чином, при використанні зі Booleanзначеннями ||повертається, trueякщо є будь-який операнд true; якщо обидва є false, повертається false.


Хіба не правильніше сказати if a is truthyпроти if a is evaluated to true?
JaredPar

3
@JaredPar: Щоб уникнути неоднозначності, я замінив своє первісне детальне пояснення на те, що розробляється з мережі розробників Mozilla. Це повинно бути менш неоднозначним.
Тадек

2
var startingNum = startingNum || 1;

У цьому випадку ви можете скористатися оператором АБО.


2
startingNum = startingNum || 1

Якщо у вас є стан з нулем, наприклад

startingNum = startingNum ? startingNum : null

ви можете використовувати "&&"

startingNum = startingNum && startingNum

Але не буде anything && nullоцінювати недійсним, якщо не anythingє фальшивим?
Петруза

Так, якщо щось є правдоподібним, воно оцінюється як недійсне. Якщо його хибність, оцінюється до значення
хибності

1

Наведені вище відповіді правильні. У JavaScript наступне твердження:

startingNum = startingNum ? otherNum : 1

можна виразити як

startingNum = otherNum || 1

Інший сценарій, не висвітлений тут, - це якщо ви хочете, щоб значення поверталося помилковим, коли воно не збігалося. Стенограма JavaScript для цього:

startingNum = startingNum ? otherNum : 0

Але це можна виразити як

startingNum = startingNum && otherNum

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


чи є скорочення для чогось подібного: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy

@Anthony Ні, тому що innerWidth * 0.0375 > 24відрізняється від if trueчастини, яка є innerWidth * 0.0375. Скорочення можна використовувати лише у тому випадку, якщо значення " expression to be evaluatedі" if trueмають однакове значення. Те саме, чому ви не змогли б стенографувати x = someBoolean ? 'Heck yea!' : 'No way!'.
дебют

@deedub добре, насправді є "стенограма" (якщо ви це так називаєте), яка була бMath.max(innerWidth * 0.0375, 24)
oldboy

@Anthony Ви б не називали це так;) Але Math.maxу вашому випадку використання працює краще, ніж потрійний оператор.
дебют

1
" startingNum = startingNum ? otherNum : 1може виражатися як startingNum = otherNum || 1" неправильно. Я щойно перевірив це
старийбоя,

0

Щоб зробити потрійний на зразок:

boolean_condition ? true_result : false_result

у javascript ви можете:

(boolean_condition && true_result ) || false_result;

Приклад:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"

соо x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24став би (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? чи є скорочення, так що мені не доведеться повторювати innerWidth * 0.0375, крім присвоєння йому змінної ???
oldboy

1
У цьому випадку, Math.max( innerWidth * 0.0375 , 24 )вийшло б елегантно. Для більш загального випадку було б добре створити описовий метод, який називається, наприклад, "somethingifiedInnerWidth", що покращує читабельність, а не створює змінну. Хоча в деяких випадках було б легше читати змінну (такої описової назви), тож у майбутньому питання "чому вона множиться на це?" не піднімається.
xxjjnn

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