Подтвердить что ты не робот

Логическое НЕ на Boolean Object всегда возвращает false в Javascript

Почему логический не оператор в javascript возвращает другой результат между Boolean значение и Boolean object? Рассмотрим следующий пример.

!true  // false
!false // true

!(new Boolean(true))  // false
!(new Boolean(false)) // false

Из spec, он говорит, что оцениваемое значение преобразуется ToBoolean. ToBoolean вернет true, если аргумент является Object, и возвращает как есть, если аргумент является логическим.

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

var a = (new Boolean(false)) ? "unexpected" : "expected";
console.log(a); // unexpected

Вопрос: является ли Boolean object объектом Object или логическим? Должен ли мы не оценивать Boolean-объект как Boolean?


UPDATE

Мой вопрос был отмечен как дублирующий вопрос с этим. Этот вопрос не имеет удовлетворительных ответов, потому что никто не отвечает на мой вопрос, Является ли Boolean объектом Object или логическим? Должны ли мы не оценивать Boolean-объект как булево?

Простое знание Boolean объекта - это недостаточно, почему он существует и что является правильным способом работы и/или проектирования объектов с булевым объектом, который все еще остается без ответа.

4b9b3361

Ответ 1

An object, независимо от того, имеет ли он свойства или нет, никогда не имеет значения false ...

new Boolean(true) вернет значение object not Boolean и !{} всегда будет false, поскольку {} является значением truthy (Boolean({}) будет оцениваться как true)

При работе с Boolean factory не создавайте новый экземпляр с помощью new (так как он создаст новый экземпляр Boolean и вернет object)

Boolean(INPUT) вернет значение primitive-Boolean указанного expression, которое может быть использовано для comparison

В документах объект Boolean является оберткой объекта для boolean value()

Описание: Значение, переданное как первый параметр, при необходимости преобразуется в значение Boolean. Если значение опущено или 0, -0, null, false, NaN, undefined, or the empty string (""), объект имеет начальное значение false. Все остальные значения, включая любой объект или строку "false", создают объект с начальным значением true.

Не путайте примитивные логические значения true и false с истинными и ложными значениями булева объекта.

Любой объект, значение которого не равно undefined или null, включая Boolean object, значение которого равно false, оценивается как true "при передаче условного оператора." [Reference]

Например, условие в следующем выражении if оценивается как true

var x = new Boolean("false");
if (x) {
  console.log('x is true');
}

var y = new Boolean(false);
if (y) {
  console.log('y is true');
}
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>

Ответ 2

Boolean - это функция. В зависимости от типа обращения он имеет другое поведение в терминах truthy и falsy.

1. Вызов как простая функция

При вызове Boolean(value) в качестве простой функции он проверяет, является ли аргумент falsy (false, null, undefined, '', 0, Nan)) или truthy (все остальные значения: экземпляры объектов, 1, true и т.д.). Этот тип вызова возвращает тип логического примитива.
Он работает как ожидалось:

Boolean(null) // prints false
Boolean(0)    // prints false

Boolean({})  // prints true
Boolean(-1)  // prints true

2. Вызов как конструктор

Как и любая функция в JavaScript, Boolean может быть вызван как конструктор: var b = new Boolean(value). Этот тип вызова возвращает экземпляр объекта boolean.
Это вводит в заблуждение, поскольку JavaScript обрабатывает экземпляры объектов как truthy.

var b = new Boolean(null);

!!b // prints true, because b is an object instance

if (b) { // b evaluates to true
   //executed code 
}

2.1. Почему возможен вызов в качестве конструктора

JavaScript позволяет этому вызову конструктора предоставить разработчику механизм сохранения свойств для Boolean. Примитивный булев тип не сохраняет присваиваемые ему свойства.

var booleanObject = new Boolean(null);
booleanObject.foo = 'bar'; // create a property
booleanObject.foo // prints 'bar'

var booleanPrimitive = false;
booleanPrimitive.foo = 'bar'; // create a property
booleanPrimitive.foo // prints undefined

2.2 Как заставить объект Boolean работать

Тем не менее, new Boolean(value) имеет механизм для сравнения. Как и любой объект JavaScript, он имеет метод valueOf(), который возвращает преобразование value в булевский примитивный тип (true для правды и false для фальшивости):

var falsyBoolean = new Boolean(null);
falsyBoolean.valueOf() // prints false, because null is falsy

var truthyBoolean = new Boolean(1);
truthyBoolean.valueOf() // prints true, because 1 is truthy

Чтобы сделать эту работу в условных выражениях, необходимо избегать любых преобразований экземпляра булевого объекта в истинное значение. Чтобы это произошло, используйте оператор сравнения == напрямую:

var falsyBoolean = new Boolean(null);

falsyBoolean == false ? 'falsy' : 'truthy' // prints expected 'falsy'

if (falsyBoolean == false) { 
  //executed code
}

Если операнд в операторе == является объектом и другим примитивным типом, JavaScript преобразует его в примитивный тип, который фактически состоит в вызове метода valueOf() для логического объекта. Подробнее см. в этой статье.

3. Как не запутаться

Лучшее правило - избегать использования Boolean как экземпляров объекта. Boolean(value) или !!value достаточно, чтобы проверить состояние переменной правды.

Ответ 3

Из Запись MDN в булевом:

Любой объект, значение которого не равно undefined или null, включая объект Boolean, значение которого является ложным, при передаче в условный оператор принимает значение true.

Например, условие в следующем выражении if равно true:

  var x = new Boolean("false");
  if (x) {
    // this code is executed
  }

  var y = new Boolean(false);
  if (y) {
    // this code is also executed
  }

Ответ 4

Вы получите тот же результат для параметров true и false при использовании new Boolean(...)

Объектно-ориентированная книга JavaScript, Стоян Стефанов:

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

""
null
undefined
0
NaN
false

So !!{}, !!new Boolean(true), !!new Boolean(false) всегда возвращает true

Это условие (без двойного отрицания):

if (new Boolean(true) === true) {

    console.log('this string will never be printed');
}

возвращает false, потому что существуют разные типы:

typeof new Boolean(true); // "object"
typeof true; // "boolean"

Вы должны сравнивать их только по значению, чтобы получить ожидаемый результат:

if (new Boolean(true) == true) {

    console.log('Yay!');
}

new Boolean(true) == true; // true
new Boolean(true) === true; // false

Другой пример:

if (new Boolean(true) === new Boolean(true)) {

    console.log('this string will never be printed')
}

В этом случае вы пытаетесь сравнить объекты. Вы получите тот же результат как с операторами ==, так и ===.

Объектно-ориентированная книга JavaScript, Стоян Стефанов:

Когда вы сравниваете объекты, вы получите правду, только если вы сравнить два ссылки на один и тот же объект. Сравнение двух различных объектов, которые имеют одинаковые методы и свойства, возвращает false.

Не используйте булевский объект new Boolean(...) вместо булевского примитива.

Ответ 5

Просто попробовал folliwng:

            alert(typeof true);    //alerts boolean
            alert(typeof new Boolean(true));   //alert object
            alert(typeof !(new Boolean(true)));   //alerts boolean
            alert(!(new Boolean(true)));         //alerts false

И Rayon, и Mukul правы, вам просто нужно использовать !Boolean(false)//возвращает true как логическое значение.