为什么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)
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足以验证变量真实状态.
| 归档时间: |
|
| 查看次数: |
3278 次 |
| 最近记录: |