逻辑非布尔对象在Javascript中始终返回false

逻辑非布尔对象在Javascript中始终返回false,javascript,Javascript,为什么在javascript中,和之间返回不同的结果?考虑下面的例子。 !true // false !false // true !(new Boolean(true)) // false !(new Boolean(false)) // false 从中,它表示正在计算的值已转换为oolean。如果参数是对象,则返回true;如果参数是布尔值,则返回原样 进一步挖掘,ToBoolean也被用在其他地方,如if语句和条件运算符,考虑下面的例子: var a = (new Boolean

为什么在javascript中,和之间返回不同的结果?考虑下面的例子。

!true  // false
!false // true

!(new Boolean(true))  // false
!(new Boolean(false)) // false
从中,它表示正在计算的值已转换为oolean。如果参数是对象,则返回true;如果参数是布尔值,则返回原样

进一步挖掘,ToBoolean也被用在其他地方,如if语句和条件运算符,考虑下面的例子:

var a = (new Boolean(false)) ? "unexpected" : "expected";
console.log(a); // unexpected
问题:布尔对象是对象还是布尔对象?我们是否应该将布尔对象作为布尔对象进行计算


更新

我的问题被标记为重复问题。这个问题没有令人满意的答案,因为没有人回答我的问题,布尔对象是对象还是布尔对象?我们是否应该将布尔对象作为布尔对象进行计算?

仅仅知道布尔对象是一个对象是不够的,为什么它会存在,以及用布尔对象处理和/或设计对象的正确方法是什么仍然没有答案

对象
,无论它是否具有属性,都不会默认为
false

new Boolean(true)
将返回一个
对象
而不是
Boolean
!{}
总是
false
,因为
{}
truthy
值(
Boolean({})
将被计算为
true

处理
Boolean
工厂函数时,不要使用
new
创建新实例(因为它将创建
Boolean
的新实例,并将返回一个
对象

布尔值(输入)
将返回指定的
表达式的
基本布尔值,该值可用于
比较

从文档中,布尔对象是
布尔值的对象包装

说明:如有必要,作为第一个参数传递的值将转换为
布尔值。如果值被省略或为
0、-0、null、false、NaN、undefined或空字符串(“”)
,则对象的初始值为
false
。所有其他值,包括任何对象或字符串“false”,都会创建一个初始值为
true
的对象

不要将基本布尔值true和false与布尔对象的true和false值混淆。

任何值不是
未定义的
null的对象,包括值为false的
布尔对象,在传递到条件语句时,计算结果为
true
[]

例如,以下if语句中的条件的计算结果为
true

var x=new Boolean(“false”);
if(x){
log('x为true');
}
var y=新布尔值(false);
如果(y){
log('y为true');
}
来自:

任何值不是未定义或null的对象,包括值为false的布尔对象,在传递到条件语句时计算结果为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
  }

我刚试过这套套服:

            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

人造丝和Mukul都是对的,你只需要使用
!Boolean(false)
//将true作为布尔值返回。

使用
新布尔值(…)
时,对于
true
false
参数,将得到相同的结果



可以使用双反运算将任何值转换为其布尔等价值。 了解任何值如何转换为布尔值非常重要。大多数价值观 转换为true,但以下情况除外,它们将转换为false

“”
null
未定义
0
NaN
false

所以
!!{}
!!新布尔值(真)
!!新布尔值(false)
始终返回
true

此条件(无双重否定):

返回
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')
}
在本例中,您尝试比较对象。使用
==
==
比较运算符将得到相同的结果



比较对象时,只有比较两个对象时,才会得到true 对同一对象的引用。比较两个不同的对象 碰巧有完全相同的方法和属性返回false


不要使用布尔对象
新布尔(…)
来代替布尔基元。

布尔是一个函数。根据调用类型的不同,它在
truthy
falsy
方面具有不同的行为

1。作为简单函数调用

作为简单函数调用
Boolean(value)
时,它会验证参数是否为
falsy
false
null
未定义
'
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)
。此调用类型返回一个。
这会带来混乱,因为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允许此构造函数调用为开发人员提供一种机制来保留
布尔值的属性创建。基本布尔类型不保存分配给它的属性

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如何使布尔对象工作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
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
}