面试题:JavaScript 其他值到布尔值的转换规则是什么?

在 JavaScript 中,当一个非布尔值被用于需要布尔值的上下文(如 if 语句、while 循环、逻辑运算符 ||/&&/! 等)时,JavaScript 会自动将其转换为布尔值。这个过程称为隐式类型转换强制类型转换(Type Coercion)

核心规则:真值(Truthy)与假值(Falsy)

JavaScript 中的任何值都可以被归类为 “真值”(truthy)“假值”(falsy)

  • 假值(falsy):在布尔上下文中被转换为 false 的值。
  • 真值(truthy):在布尔上下文中被转换为 true 的值。

一、6 个(或 7 个)假值

JavaScript 中只有 6 个(或 7 个)假值,记住它们即可:

  1. false:布尔类型的 false
  2. 0:数字零。
  3. -0:负零(虽然数值上等于 0,但也是假值)。
  4. 0n:BigInt 的零(BigInt(0))。
  5. "":空字符串。
  6. null
  7. undefined
  8. 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!"); 
} // 会执行!

三、如何手动进行布尔转换?

你可以使用以下方法显式地将任意值转换为布尔值:

  1. Boolean() 构造函数Boolean(0) // false Boolean("hi") // true
  2. 双重非操作符 !!
    javascript !!0 // false !!"hello" // true !!null // false !!{} // true

!! 是一种常见的技巧,用于快速获取一个值的布尔等价形式。


四、为什么空数组 [] 和空对象 {} 是真值?

这是 JavaScript 的设计决策:

  • 对象(包括数组)是引用类型,只要对象存在(即不是 nullundefined),它就被认为是“存在的”或“有内容的”,因此是真值。
  • 空数组 [] 仍然是一个对象,有 .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, NaNfalse
真值 (truthy)所有其他值(包括 "0", "false", [], {}, function(){}, Infinity 等)true

关键点:记住那 8 个假值,其余都是真值。避免误以为 "0"[] 是假值。在条件判断中,理解真值/假值规则是避免逻辑错误的基础。

THE END
喜欢就支持一下吧
点赞11 分享