Сравнение троичного оператора, оператора Элвиса, оператора безопасной навигации и логических операторов или

сравнение с тернарным оператором против оператора Элвиса против безопасного оператора навигации против логических операторов или в angular


тернарный оператор(оператор ? obj: obj)

let gender = user.male ? "male" : "female";

Оператор Элвиса (?: )

let displayName = user.name ?: "";

Безопасный Оператор Навигации (?.)

let displayName = user.name ?. "";

логические операторы or

let displayName = user.name || "";

вышеупомянутые операторы аналогично выполняют один и тот же процесс. Каковы преимущества разницы и какой из них лучший и худший?

4 ответов


возможно, я пропустил пару версий, но, насколько мне известно, TypeScript не имеет оператора Элвиса или безопасного оператора навигации. Единственное, что у них есть, это ненулевой оператор утверждения !., но это только для компилятора, а в скомпилированном js ! будут удалены. Угловой, однако, имеет безопасный оператор навигации внутри своих шаблонов, но под капотом это разрешится в логическое или ||. Преимущество здесь увеличенная удобочитаемость и меньшие шаблоны.

кроме того, TypeScript имеет ?: нотация, но это используется в интерфейсах или параметрах метода, чтобы указать, что значение является необязательным

что оставляет нас с тернарным оператором против логического ИЛИ. Вы бы использовали первый, если есть 3 значения. Вопрос, ответ да результат, и ответ нет результата на указанный вопрос.

и последний, когда есть 2 значения. Где первый, если решился на правду будет ответ, а иначе и второй, независимо от его значения.

польза мудрая, я не могу сказать много. Я бы ожидал, что они будут одинаково быстрыми, с незначительной разницей. Возможно, читаемость увеличивается с помощью троичного варианта, который вы, очевидно, всегда можете использовать вместо логического ИЛИ ||, но лично мне нравится использовать ||, потому что он держит код компактным.

TLDR;

  • троичная Оператор

упрощенный, если еще, доступный везде

  • оператор Элвис ?:

недоступно в typescript / javascript / angular и по существу так же, как ||

  • Безопасный оператор навигации ?.

доступно только в угловых шаблонах, используемых для предотвращения нулевых указателей в параметре объекта навигация

  • логическое или ||

если не левой рукой, то правой рукой. Еще проще, если иначе. Доступно в typescript / javascript / angular


let gender = user.male ? "male" : "female";

может использоваться в javascript(Typescript) а также в HTML - тег привязки ,

в основном, когда вы используете этот оператор в коде javascript, это означает, что если первое утверждение истинно, чем выполнить первый в противном случае выполнить второй вариант

в angular2 терминах Ternary Operatorназывается Safe Navigation Operator (?.) или вы можете использовать термин Elvis Operator (?: ), который используется во время загрузки асинхронных данных из хранилища или какой-то databse.

запасной : - вы также можете использовать Elvis Operator (?: ) в angular2 шаблон такой (можно сказать, это свойство стенография)

let gender = user.gender || "";

посмотреть здесь


Безопасный Оператор Навигации (?.) который также ошибочно называется оператором Элвиса в Angular2 только

это привязка шаблона Angular2, она недоступна в javascript.

тернарный оператор(оператор ? obj: obj)

Это, когда вы хотите проверить условие и если это условие истинно, верните значение или если оно ложно, верните другое значение.

логическое или операторы

Это когда вы хотите вернуть значение, основанное на его собственном существовании или правдивости (поэтому нет другого правила), это очень отличается от Тернери.

let displayName = user.name || "";

в приведенном выше примере вы говорите, что если любое из этих выражений истинно, верните его, где находится в bellow:

let gender = user.male ? "male" : "female";

то, что вы говорите : если мое состояние правдиво, верните "мужской", иначе верните "женский"

Оператор Элвиса (?: )

это недоступно в javascript, и вы можете найти его на других языках, таких как PHP , и он в основном такой же, как оператор Тернери, но упрощенный, в случае, когда левая сторона сравнения ( сторона истины ) может использоваться в качестве возвращаемого значения :

так :

let m = something ?: somethingElse // if in case of truthiness of `something` you want to return `something` , you can do this

равен :

let m = something ? something : somethingElse 

изменить : Не имеет смысла сравнивать их, они делают совсем не то же самое.


@Milad RameshRajendran вы можете использовать термин elvis вместо оператора безопасной навигации (?.) в angular2, по-моему, оба одинаковы, не путайте с именем


Я получил кое-что от этого источник:

Оператор Элвиса (?: )

"оператор Элвиса" - это сокращение тернарного оператора Java. Один пример того, где это удобно для возвращая 'значение по умолчанию' значение если выражение значение false или ноль. Простой пример может выглядеть это:

def gender = user.male ? "male" : "female"  //traditional ternary operator usage

def displayName = user.name ?: "Anonymous"  //more compact Elvis operator

Безопасный Оператор Навигации (?.)

используется оператор безопасной навигации чтобы избежать исключения NullPointerException. Обычно, когда у вас есть ссылка на объект, который может потребоваться проверить что это не null перед обращением методы или свойства объекта. Чтобы избежать этого, безопасная навигация оператор просто вернет 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

но я хочу знать, что все вышеперечисленные операторы аналогично выполняют один и тот же процесс. Каковы преимущества разница и какой из них лучший и худший?