JavaScript中的“假”值是什么

原文:What is “Falsy” in JavaScript?

JavaScript的类型强制转换导致代码很容易出错,但如果理解了基本原理,可以省去很多无用的类型检查。本文简述了假值。

在JavaScript中,如果一个值,内置类型强制转换为false,那么称之为“假”值。例如,分析以下的if语句:

1
2
3
if (v) {
console.log('v is not falsy');
}

v不是以下值时,console.log()才能运行:

  • false
  • 0
  • 0n: BigInt 0
  • '': 空字符串
  • null
  • undefined
  • NaN

这7个值就是JavaScript中的假值,其他任何值都是真值

其中,非null对象总是真值,即便它的valueOf()函数返回一个假值。

1
2
3
4
5
6
function isFalsy(v) {
return !v;
}

// 不是假值。用`0`构建的Number对象也是真值,虽然0是假值。
isFalsy(new Number(0));

建议

在if语句中用隐性的类型转换得到真/假值,是典型的混乱之源。大部分场景下,7个假值与你所需的判断是不匹配的。

例如,要实现一个检查字符串是否少于25个字符的函数。

1
2
3
4
5
6
function checkLength(v) {
if (!v) {
throw new Error('必须提供一个字符串!');
}
return v.length < 25;
}

出乎意料的是,checkLength('')会抛出错误,因为空字符串是假值。应该像这样检查v是不是字符串:

1
2
3
4
5
6
function checkLength(v) {
if (typeof v !== 'string') {
throw new Error('必须提供一个字符串!');
}
return v.length < 25;
}

空值

除了检查真/假值,通常更多的是检查“空”值。一个常见的检查空值的例子是,在获取v的属性时,确保不会报错:TypeError: Cannot read property 'xxx' of null

除了nullundefinedv是其他值时访问v.prop都不会报错,即使NaN.prop也不会报错。

1
2
3
const x = Number('abc');
x; // NaN
x.prop; // undefined

检查v == null等价于v === null || v === undefined。也就是说,只有在值是nullundefined时,它才== null。检查v == null,在空值检查中,比真假值更精确。