在 JavaScript 中,当一个非布尔值被用于需要布尔值的上下文(如 if
语句、while
循环、逻辑运算符 ||
/&&
/!
等)时,JavaScript 会自动将其转换为布尔值。这个过程称为隐式类型转换或强制类型转换(Type Coercion)。
核心规则:真值(Truthy)与假值(Falsy)
JavaScript 中的任何值都可以被归类为 “真值”(truthy) 或 “假值”(falsy)。
- 假值(falsy):在布尔上下文中被转换为
false
的值。 - 真值(truthy):在布尔上下文中被转换为
true
的值。
一、6 个(或 7 个)假值
JavaScript 中只有 6 个(或 7 个)假值,记住它们即可:
false
:布尔类型的false
。0
:数字零。-0
:负零(虽然数值上等于 0,但也是假值)。0n
:BigInt 的零(BigInt(0)
)。""
:空字符串。null
undefined
NaN
:不是一个数字(Not-a-Number)。
✅ 记忆口诀:
0
,-0
,0n
,""
,false
,null
,undefined
,NaN
。
if (false) { } // 不执行
if (0) { } // 不执行
if (-0) { } // 不执行
if (0n) { } // 不执行
if ("") { } // 不执行
if (null) { } // 不执行
if (undefined) { } // 不执行
if (NaN) { } // 不执行
二、所有其他值都是真值
除了上述 8 个假值,JavaScript 中的所有其他值都是真值,包括:
- 非空字符串:
"0"
,"false"
," "
(空格),"hello"
等。 - 非零数字:
1
,-1
,3.14
,Infinity
,-Infinity
。 - 所有对象:
{}
,[]
,function(){}
,new Date()
,new Map()
等。 - 所有函数:即使函数体为空。
- 所有数组:即使是空数组
[]
。
常见易错点示例:
Boolean("0") // true ← 字符串 "0" 是真值!
Boolean("false") // true ← 字符串 "false" 是真值!
Boolean([]) // true ← 空数组是真值!
Boolean({}) // true ← 空对象是真值!
Boolean(function(){}) // true ← 函数是真值!
Boolean(Infinity) // true
Boolean(-1) // true
if ("0") {
console.log("This runs!");
} // 会执行!
if ([]) {
console.log("This also runs!");
} // 会执行!
if ({}) {
console.log("And this too!");
} // 会执行!
三、如何手动进行布尔转换?
你可以使用以下方法显式地将任意值转换为布尔值:
Boolean()
构造函数:Boolean(0) // false Boolean("hi") // true
- 双重非操作符
!!
:javascript !!0 // false !!"hello" // true !!null // false !!{} // true
!!
是一种常见的技巧,用于快速获取一个值的布尔等价形式。
四、为什么空数组 []
和空对象 {}
是真值?
这是 JavaScript 的设计决策:
- 对象(包括数组)是引用类型,只要对象存在(即不是
null
或undefined
),它就被认为是“存在的”或“有内容的”,因此是真值。 - 空数组
[]
仍然是一个对象,有.length
属性、可以调用.push()
方法等。 - 如果你需要检查数组是否为空,应该使用
arr.length === 0
,而不是依赖布尔转换。
const arr = [];
if (arr) {
// 这里会执行,因为 arr 是真值
if (arr.length === 0) {
console.log("Array is empty");
}
}
总结
类别 | 值 | 转换为布尔值 |
---|---|---|
假值 (falsy) | false , 0 , -0 , 0n , "" , null , undefined , NaN | false |
真值 (truthy) | 所有其他值(包括 "0" , "false" , [] , {} , function(){} , Infinity 等) | true |
关键点:记住那 8 个假值,其余都是真值。避免误以为 "0"
或 []
是假值。在条件判断中,理解真值/假值规则是避免逻辑错误的基础。
THE END