Двойное отрицание (!!) в javascript - в чем цель?

Возможный дубликат:
Что такое!! (не) в JavaScript?

Я столкнулся с этой частью кода

function printStackTrace(options) {
    options = options || {guess: true};
    var ex = options.e || null, guess = !!options.guess;
    var p = new printStackTrace.implementation(), result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

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

(код из https://github.com/eriwen/javascript-stacktrace/blob/master/stacktrace.js)

Ответ 1

Отбрасывает значение boolean. Первый ! отменяет его один раз, преобразуя значения так:

  • undefined to true
  • null to true
  • +0 to true
  • -0 to true
  • '' to true
  • NaN to true
  • false to true
  • Все остальные выражения для false

Затем другой ! снова отменяет его. Конкретный листинг для булевых, что эквивалентно ToBoolean просто потому, что ! определяется как его отрицание. Его ненужное здесь, однако, потому, что оно используется только как условие условного оператора, которое точно определит правду.

Ответ 2

var x = "somevalue"
var isNotEmpty = !!x.length;

Позвольте разбить его на части:

x.length   // 9
!x.length  // false
!!x.length // true

Поэтому он использовал преобразование значения "truethy" \ "falsy" в логическое значение.


Следующие значения эквивалентны false в условных операторах:

  • ложь
  • NULL
  • undefined
  • Пустая строка "" (\ '')
  • Число 0
  • Число NaN

Все остальные значения эквивалентны true.

Ответ 3

Двойное отрицание превращает "правдивое" или "ложное" значение в логическое значение, true или false.

Большинство из них знакомы с использованием правдивости в качестве теста:

if (options.guess) {
    // runs if options.guess is truthy, 
}

Но это не обязательно означает:

options.guess===true   // could be, could be not

Если вам нужно принудительно ввести "истинное" значение в истинное логическое значение, !! - это удобный способ сделать это:

!!options.guess===true   // always true if options.guess is truthy