为何JavaScript中valueOf()传入false返回true?嵌套Boolean对象疑问解析
Boolean对象与valueOf()行为解析
嘿,这个问题的核心其实是搞混了JavaScript里的原始布尔值和Boolean包装对象的区别,咱们一步步把它说清楚:
1. 为什么嵌套Boolean对象的valueOf()会返回true?
先纠正一个小误区:如果你直接写new Boolean(false).valueOf(),返回的其实是false——你遇到的返回true的情况,是嵌套创建Boolean对象的场景(也就是你给出的代码示例)。
这里的关键知识点有两个:
- 所有用
new Boolean(xxx)创建的包装对象,本质上都是一个JavaScript对象——而在JavaScript里,任何对象(哪怕它包装的是false)在布尔判断中都是真值(truthy)。 - Boolean构造函数的规则:当你传入一个非原始布尔值的参数时,它会先判断这个参数是否为真值,如果是,就创建一个包装了
true的对象;如果是假值(falsy),就创建包装false的对象。
那你的代码var value = new Boolean(new Boolean(false)).valueOf();到底发生了什么?
- 第一步:
new Boolean(false)创建了一个包装对象(我们叫它obj1),它内部包装的原始值是false,但obj1本身是一个对象,属于真值。 - 第二步:把
obj1传给外层的new Boolean(),因为obj1是真值,所以外层构造函数会将其转换为true,创建出一个新的包装对象obj2,它内部的原始值是true。 - 第三步:调用
obj2.valueOf()——这个方法的作用就是返回包装对象内部存储的原始布尔值,所以最终返回true。
2. 传入false时valueOf()什么时候会返回true?
正常情况下,直接传入原始值false给new Boolean(),调用valueOf()会返回false。只有当你传入的参数不是原始的false,而是一个被JavaScript判定为真值的值时,valueOf()才会返回true。举几个例子:
- 传入任何对象(包括包装了false的Boolean对象):
new Boolean({}).valueOf()→true - 传入非空字符串:
new Boolean("test").valueOf()→true - 传入非零数字:
new Boolean(1).valueOf()→true
只有当你传入的是**假值(falsy)**时——也就是false、undefined、null、空字符串""、数字0、NaN这几个——new Boolean(xxx).valueOf()才会返回false。
内容的提问来源于stack exchange,提问作者Saqib Ahmed
相关产品推荐
相关产品推荐

