Я объясню на примере:
Элвис Оператор (?:)
«Оператор Элвиса» является сокращением троичного оператора Java. Один из примеров того, где это удобно, - это возвращение «разумного значения по умолчанию», если выражение принимает значение false или ноль. Простой пример может выглядеть так:
def gender = user.male ? "male" : "female" //traditional ternary operator usage
def displayName = user.name ?: "Anonymous" //more compact Elvis operator
Оператор безопасной навигации (?.)
Оператор безопасной навигации используется, чтобы избежать исключения NullPointerException. Обычно, когда у вас есть ссылка на объект, вам может потребоваться проверить, что он не является нулевым, прежде чем получить доступ к методам или свойствам объекта. Чтобы избежать этого, оператор безопасной навигации просто возвратит null вместо того, чтобы выдавать исключение, например так:
def user = User.find( "admin" ) //this might be null if 'admin' does not exist
def streetName = user?.address?.street //streetName will be null if user or user.address is null - no NPE thrown
??
) в javascript? Все, что я обнаружил до сих пор, говорит о том, что у JS есть только «фальси» слияние (использование||
).Ответы:
Вы можете использовать логический оператор «ИЛИ» вместо оператора Элвиса:
Например
displayname = user.name || "Anonymous"
.Но Javascript в настоящее время не имеет другой функциональности. Я бы порекомендовал посмотреть на CoffeeScript, если вы хотите альтернативный синтаксис. Он имеет некоторые сокращения, которые похожи на то, что вы ищете.
Например, экзистенциальный оператор
Функциональные ярлыки
Сексуальная функция вызова
Также есть многострочные комментарии и классы. Очевидно, вы должны скомпилировать это в javascript или вставить на страницу,
<script type='text/coffeescript>'
но это добавляет много функциональности :). Использование<script type='text/coffeescript'>
действительно предназначено только для разработки, а не производства.источник
<script type='coffee/script>'
?<script type="text/coffeescript">
.x === undefined
.Я думаю, что следующее эквивалентно оператору безопасной навигации, хотя и немного дольше:
streetName
тогда будет либо значениеuser.address.street
илиundefined
.Если вы хотите, чтобы по умолчанию было что-то еще, вы можете комбинировать с вышеупомянутым ярлыком или дать:
источник
Оператор логического ИЛИ Javascript имеет короткое замыкание и может заменить ваш оператор «Элвис»:
Однако, насколько мне известно, нет эквивалента вашему
?.
оператору.источник
||
можно использовать таким образом. Имейте в виду , что это будет сливаться не только тогда , когда выражениеnull
, но когда это не определено,false
,0
или пустая строка.""
или0
может быть неожиданным, хотя :)Иногда я находил следующую идиому полезной:
можно переписать как:
Это использует тот факт, что получение неизвестных атрибутов на объекте возвращает неопределенное значение, а не генерирует исключение, как на
null
илиundefined
, поэтому мы заменяем нулевое и неопределенное пустым объектом перед навигацией.источник
&&
метод. +1.я думаю, что lodash
_.get()
может помочь здесь, как_.get(user, 'name')
и в более сложных задачах, таких как_.get(o, 'a[0].b.c', 'default-value')
источник
В настоящее время существует проект спецификации:
https://github.com/tc39/proposal-optional-chaining
https://tc39.github.io/proposal-optional-chaining/
Пока что мне нравится использовать lodash
get(object, path [,defaultValue])
или dlvdelve(obj, keypath)
Обновление (по состоянию на 23 декабря 2019 г.):
источник
2019 Обновление
JavaScript теперь имеет эквиваленты как для оператора Элвиса, так и для оператора безопасной навигации.
Безопасный доступ к собственности
По желанию оператора цепочки (
?.
) в настоящее время является 4 -й стадии ECMAScript предложение . Вы можете использовать это сегодня с Бабелем .Логический оператор (
&&
) является «старым», более-многословнымом способом справиться с таким сценарием.Предоставление дефолта
Nullish оператор коалесцирующий (
??
) в настоящее время является стадия 3 ECMAScript предложение . Вы можете использовать это сегодня с Бабелем . Это позволяет вам установить значение по умолчанию, если левая часть оператора является нулевым значением (null
/undefined
).Логический оператор ИЛИ (
||
) является альтернативным решением с немного различным поведением . Это позволяет вам установить значение по умолчанию, если левая часть оператора ложная . Обратите внимание, что результатmyVariable3
ниже отличается отmyVariable3
выше.источник
Для первого вы можете использовать
||
. Оператор Javascript «логический или», а не просто возвращает постоянные истинные и ложные значения, следует правилу возврата левого аргумента, если он истинен, и в противном случае оценивает и возвращает свой правый аргумент. Когда вас интересует только значение истинности, оно работает так же, но это также означает, что онfoo || bar || baz
возвращает самый левый из foo, bar или baz, который содержит истинное значение .Вы не найдете такой, которая может отличить ложь от нуля, а 0 и пустая строка являются ложными значениями, поэтому избегайте использования
value || default
конструкции, где наvalue
законных основаниях может быть 0 или""
.источник
Да, есть! 🍾
Необязательная цепочка находится на стадии 4, и это позволяет вам использовать
user?.address?.street
формулу.Если вы не можете дождаться релиза, установите
@babel/plugin-proposal-optional-chaining
и вы можете использовать его. Вот мои настройки, которые работают для меня, или просто прочитайте статью Nimmo .источник
Вот простой эквивалент оператора Элвиса:
источник
ОБНОВЛЕНИЕ СЕНТЯБРЯ 2019
Да, JS теперь поддерживает это. Опциональная цепочка скоро появится в v8 подробнее
источник
Это чаще всего называют оператором слияния нулей. У Javascript его нет.
источник
Вы можете достичь примерно того же эффекта, сказав:
источник
У меня есть решение для этого, адаптировать его к вашим собственным потребностям, выдержка из одной из моих библиотек:
работает как шарм. Наслаждайся меньшей болью!
источник
Вы можете свернуть свой собственный:
И используйте это так:
* результат не определен, если любой из a, b, c или d не определен.
источник
Я прочитал эту статью ( https://www.beyondjava.net/elvis-operator-aka-safe-navigation-javascript-typescript ) и изменил решение с помощью прокси.
Вы называете это так:
Результат будет неопределенным для выражения, которое встречается с нулевым или неопределенным на своем пути. Вы можете сойти с ума и изменить прототип Object!
источник
Очень поздно, есть предложение [1] об опциональной цепочке в настоящее время на стадии 2, с доступным плагином babel [2]. В настоящее время его нет ни в одном браузере, о котором я знаю.
источник
Это было проблемой для меня долгое время. Мне пришлось придумать решение, которое можно легко перенести, когда мы получим оператора Элвиса или что-то в этом роде.
Это то, что я использую; работает как для массивов, так и для объектов
положить это в файл tools.js или что-то
пример использования:
хорошо, я знаю, что это делает код немного нечитаемым, но это простое решение с одним вкладышем и прекрасно работает. Надеюсь, это кому-нибудь поможет :)
источник
Это было интересное решение для оператора безопасной навигации с использованием некоторого миксина.
http://jsfiddle.net/avernet/npcmv/
источник
Я создал пакет, который делает его намного проще в использовании.
NPM JSDIG Github JSDIG
Вы можете обрабатывать простые вещи, такие как и объект:
или немного сложнее:
источник
Лично я использую
и, например, безопасно получить:
источник
e({a:{b:{c:{d:'test'}}}}, 'a.b.c.d')
возвращаетсяnull
.e = eval
,var a = eval('obj.a.b.c.d')
.eval
даже не принимает второй параметр ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…