Logical NOT on Boolean Object在Javascript中始终返回false

Hen*_*zia 26 javascript

为什么javascript中的逻辑非运算符在布尔值和布尔对象之间返回不同的结果?请考虑以下示例.

!true  // false
!false // true

!(new Boolean(true))  // false
!(new Boolean(false)) // false
Run Code Online (Sandbox Code Playgroud)

根据规范,它表示正在评估的值被转换ToBoolean.如果参数是Object,ToBoolean将返回true,如果参数是Boolean,则返回原样.

进一步挖掘,ToBoolean也用于if语句和条件运算符等其他地方,请考虑以下示例:

var a = (new Boolean(false)) ? "unexpected" : "expected";
console.log(a); // unexpected
Run Code Online (Sandbox Code Playgroud)

问题:布尔对象是一个Object还是一个布尔值?我们不应该将布尔对象评估为布尔值吗?


UPDATE

我的问题被标记为重复的问题,这.那个问题没有一个令人满意的答案,因为没有人回答我的问题,布尔对象是一个对象,还是布尔值?我们不应该将布尔对象评估为布尔值吗?

简单地知道布尔对象是一个对象是不够的,为什么它甚至存在,并且处理和/或设计具有布尔对象的对象的正确方法仍然没有答案.

Ray*_*yon 31

一个object,无论它是否具有属性,永远不会默认为false......

new Boolean(true)将返回一个objectnot Boolean并且!{}总是将false作为{}一个truthy值(Boolean({})将被评估为true)

在处理Boolean工厂函数时,不要使用创建新实例new(因为它将创建新实例Boolean并将返回object)

Boolean(INPUT)将返回可用于primitive-Boolean指定的值expressioncomparison

从docs,Boolean对象是boolean value()的对象包装器

描述: 如果需要,作为第一个参数传递的值将转换为boolean值.如果省略或者是0, -0, null, false, NaN, undefined, or the empty string (""),则对象的初始值为false.所有其他值(包括任何对象或字符串"false")都会创建一个初始值为的对象true.

不要将原始布尔值true和false与Boolean对象的true和false值混淆.

值不为undefined或者null包含Boolean object其值为false的任何对象的计算结果为true "传递给条件语句时".[ 参考 ]

例如,以下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');
}
Run Code Online (Sandbox Code Playgroud)
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


Dmi*_*tin 6

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
Run Code Online (Sandbox Code Playgroud)

2.作为构造函数调用

像JavaScript中的任何函数一样,Boolean可以作为构造函数调用:var b = new Boolean(value).此调用类型返回一个布尔对象实例.
这引入了混乱,因为JavaScript将对象实例视为truthy值.

var b = new Boolean(null);

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

if (b) { // b evaluates to true
   //executed code 
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

2.2如何使布尔对象起作用

不过,new Boolean(value)有一个机制可以做比较.像任何JavaScript对象一样,它有一个方法valueOf(),它返回value一个true布尔基元类型的转换(对于truthy和falsefor falsy):

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
Run Code Online (Sandbox Code Playgroud)

为了使这个工作在条件中,有必要避免将布尔对象实例转换为truthy值.要实现这一点,请==直接使用比较运算符:

var falsyBoolean = new Boolean(null);

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

if (falsyBoolean == false) { 
  //executed code
}
Run Code Online (Sandbox Code Playgroud)

如果在操作数==运算符是一个对象和其他基本类型,JavaScript的将其转换为原始类型,这实际上在于调用valueOf()布尔对象上的方法.请参阅本文中的更多详细信息.

3.如何不要混淆

最好的规则是避免使用任何Boolean对象实例.Boolean(value)或!!value足以验证变量真实状态.