JS двойной восклицательный знак - есть ли веская причина использовать его? - PullRequest
6 голосов
/ 20 сентября 2011

Я обсуждаю эту тему с коллегой около недели. Я очень большой поклонник сокращенного кода, использующего троицы и т. Д. Везде, где могу. В последнее время он настаивал на том, что я использую двойные восклицания. После выполнения многочисленных тестов, я начинаю с ним соглашаться ... двойные восклицания не могут быть разумными для использования в моем коде. Учтите это:

var myvar = "Hello";
return (!!myvar ? "Var is set" : "Var is not set");

Приведенный выше пример работает как положено. Однако, если мы проверяем переменную, которая может возвращать undefined, мы получаем ошибку, особенно в IE7. Однако мы получим ожидаемый результат, если запустим это в нашей консоли:

if(randomvar) alert('Works');

При использовании этого подхода, если переменная не определена, она молча завершается неудачей. Это заставляет меня усомниться в двойных восклицаниях. Есть ли ситуация, которая действительно делает этого оператора выгодным?

Ответы [ 4 ]

9 голосов
/ 20 сентября 2011

Существует допустимое использование для !! в JavaScript. Это выражение, которое будет принимать значение и преобразовывать его в логическое значение true или false. По сути, это приводит текущее состояние в логическое состояние.

Это хорошо для обоих

  1. Захват правдивости значения
  2. Освобождение исходного объекта для сбора (если это будет окончательная ссылка)
  3. Помогает предотвратить последующее неправильное использование объекта с принудительным равенством (==). Не мешает им всем, но вынуждает его к булу удаляет набор сценариев.
6 голосов
/ 20 сентября 2011

!!x приводит x к логическому значению со свойствами x == !!x и typeof !!x === "boolean". (В целом, может быть неверно, если вы переопределите valueOf, но сейчас я не хочу об этом думать.)

1 голос
/ 14 марта 2014

Я тестировал в IE - !!undefined возвращает false.Который я считаю правильным поведением.

Что касается того, где !! полезно (или может быть).

Вот пример:

Предположим, у вас есть функция, которая принимаетпараметр:

function test(param) { if (param === true) { alert('OK'); } }

Вызов с: test(1) не вызовет всплывающее окно предупреждения - хотя обычно считается, что 1 является true или true -ishзначение.Да, кто-то может возразить, что в команде и каждой разработчике лежит ответственность за передачу точного типа данных, но какой тип данных в JavaScript правильный?Особенно, когда у вас нет компилятора, который бы проверял, какой именно.

Таким образом, в описанной выше ситуации я бы использовал if (!!param) вместо if (param === true)

0 голосов
/ 20 сентября 2011

Итак, я понимаю, что typeof !!x === "boolean" и логика, лежащая в его основе (!x приводится к инвертированному логическому значению, !!x инвертируется обратно и т. Д.), Но мне интересно, если это по своей природе проблематично? Если вы приведете неопределенную переменную, вы получите ошибку сценария в ваших руках. Я бы ожидал, что !!x == false, если typeof !!x === "undefined", но это не так. Похоже, это был бы более безопасный выбор:

if((typeof x != "undefined") && (x != null)) { ... }

Может ли кто-нибудь представить сценарий, в котором использование !!x более уместно? На данный момент я не вижу пользы от его использования.

Почесывая голову ...

...