逻辑非布尔对象在Javascript中始终返回false
为什么在javascript中,和之间返回不同的结果?考虑下面的例子。逻辑非布尔对象在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
!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
}