JS真值与假值全面总结(含面试题型+实例解析)
在JavaScript开发与面试中,真值(truthy)与假值(falsy)是高频基础考点,也是容易踩坑的知识点。很多开发者会混淆“空值”与“假值”、“真值”与“true”的概念,导致代码逻辑出错或面试失分。本文将系统总结JS中真值与假值的全部情况,结合面试高频题型、实例应用,帮你彻底掌握这一知识点,强化记忆、规避陷阱。
一、核心定义:真值与假值是什么?
JavaScript中,所有值都可以被隐式转换为布尔值(即“布尔上下文”),根据转换结果可分为两类:
- 假值(Falsy) :在布尔转换时会被转为
false的值,是JS明确规定的固定集合(仅6个),记住这6个,其余全是真值。 - 真值(Truthy) :在布尔转换时会被转为
true的值,除6个假值外,所有值(包括空数组、空对象等)均为真值。
关键提醒:真值≠true,假值≠false。true是布尔类型的真值,false是布尔类型的假值;而其他类型的真值(如1、'abc')、假值(如0、''),是“能被转为true/false”,本身并非布尔值。
二、必记:6个假值(Falsy)详解(面试高频考点)
这6个假值是面试中考查的核心,必须精准记忆,每个假值的细节、易错点都要掌握,以下结合实例说明:
1. false(布尔型)
最直接的假值,布尔类型的默认假值,无太多易错点。
console.log(!!false); // false(直接转换为布尔值)
if (false) { console.log('执行'); } // 不执行
2. 0 / -0(数字型)
注意:仅数字0(含负0)是假值,其他非0数字(包括正数、负数、小数、Infinity)均为真值。易错点:-0 === 0 为true,二者均为假值。
console.log(!!0); // false
console.log(!!-0); // false
console.log(!!1); // true(非0数字是真值)
console.log(!!-1); // true
console.log(!!0.1); // true
console.log(!!Infinity); // true(Infinity是真值)
3. '' / ""(空字符串)
仅“长度为0的字符串”是假值,只要字符串非空(哪怕内容是“假值相关”),均为真值。高频易错点:'0'、'false'、' '(空格字符串)都不是假值。
console.log(!!''); // false(空字符串)
console.log(!!'0'); // true(非空,哪怕内容是0)
console.log(!!'false'); // true(非空,哪怕内容是false)
console.log(!!' '); // true(空格字符串,长度≠0)
4. null(空值型)
表示“空值”,是一个独立的原始值,类型为object(JS历史遗留bug),无法被修改,是典型假值。易错点:null ≠ undefined,二者转换为布尔值均为false,但语义不同。
console.log(!!null); // false
console.log(typeof null); // object(特殊点)
let a = null;
console.log(a === undefined); // false
5. undefined(未定义型)
表示“未定义”,变量声明后未赋值、函数无返回值、对象未定义的属性,均为undefined。易错点:undefined是原始值,不能用new实例化。
console.log(!!undefined); // false
let b;
console.log(!!b); // false(声明未赋值,默认undefined)
function fn() {}
console.log(!!fn()); // false(无返回值,默认undefined)
6. NaN(数字型)
表示“非数字”,由无效的数字运算产生(如0/0、parseInt('abc')),是唯一“不等于自身”的假值。高频易错点:NaN !== NaN,判断是否为NaN需用isNaN()或Number.isNaN()。
console.log(!!NaN); // false
console.log(NaN === NaN); // false(唯一不等于自身的值)
console.log(isNaN(0/0)); // true
console.log(Number.isNaN(parseInt('abc'))); // true
三、真值(Truthy)详解:除假值外,全是真值
真值的范围极广,无需逐一记忆,记住“排除6个假值,其余都是真值”即可。重点掌握以下高频易错的真值场景(面试常考):
1. 基础类型真值
- 非0数字:1、-1、0.1、Infinity、-Infinity(如上面实例所示);
- 非空字符串:'0'、'false'、' '、'NaN'、'abc'(哪怕内容是假值相关,只要非空就是真值);
- Symbol类型:所有Symbol值(如Symbol('foo')),均为真值。
console.log(!!Symbol('foo')); // true
console.log(!!'NaN'); // true
console.log(!!'-123'); // true
2. 引用类型真值(高频易错点)
JavaScript中,所有引用类型(对象、数组、函数、日期对象等),哪怕是空的,也都是真值——这是面试中最容易出错的点,很多人会误以为“空数组、空对象是假值”。
// 空数组:真值
console.log(!![]); // true
if ([]) { console.log('空数组执行'); } // 执行
// 空对象:真值
console.log(!!{}); // true
if ({}) { console.log('空对象执行'); } // 执行
// 空函数:真值
console.log(!!function(){}); // true
// 无效日期对象:仍为真值(易错点)
const invalidDate = new Date('abc');
console.log(!!invalidDate); // true(对象本身是真值)
console.log(isNaN(invalidDate.getTime())); // true(判断日期是否有效)
3. 特殊真值场景
即使容器内的内容是假值,容器本身(数组、对象)仍为真值:
console.log(!![0]); // true(数组含假值0,但数组本身是真值)
console.log(!!{a: null}); // true(对象含假值null,但对象本身是真值)
console.log(!![false, NaN]); // true
四、面试高频题型解析(结合实例,强化记忆)
真值与假值的考查,多以“判断输出结果”“选择题”形式出现,以下是5道高频面试题,结合解析帮你巩固知识点,避免踩坑。
题型1:判断下列表达式的返回值(基础题)
console.log(!!' '); // ?
console.log(!![]); // ?
console.log(!!null); // ?
console.log(!!'false'); // ?
console.log(!!NaN); // ?
解析:结合前面知识点,答案依次为:true、true、false、true、false。
易错点:空格字符串(' ')是非空字符串,为真值;空数组([])是引用类型,为真值。
题型2:判断if语句是否执行(高频易错)
// 题目1
if (0) {
console.log('执行1');
} else if ('0') {
console.log('执行2');
}
// 题目2
if ([]) {
console.log('空数组执行');
} else if ({}) {
console.log('空对象执行');
}
解析:
- 题目1:0是假值,不执行第一个if;'0'是非空字符串,是真值,执行else if,输出“执行2”;
- 题目2:空数组是真值,执行第一个if,输出“空数组执行”(空对象不会被执行)。
题型3:结合逻辑运算符考查(进阶题)
console.log(0 || 'abc'); // ?
console.log('' && 123); // ?
console.log([] || null); // ?
console.log(NaN && 'test'); // ?
解析:逻辑运算符(||、&&)的核心是“短路求值”,返回的是“原始值”,而非布尔值:
- ||:找第一个真值,若全为假值,返回最后一个假值;0是假值,'abc'是真值,返回'abc';
- &&:找第一个假值,若全为真值,返回最后一个真值;''是假值,直接返回'';
- []是真值,直接返回[](短路,不判断null);
- NaN是假值,直接返回NaN(短路,不判断'test')。
答案依次:'abc'、''、[]、NaN。
题型4:结合函数返回值考查(面试真题)
function getValue() {
// 无返回值,默认返回undefined
}
const res1 = getValue();
console.log(!!res1); // ?
function getArr() {
return [];
}
const res2 = getArr();
console.log(!!res2); // ?
解析:res1是undefined(假值),返回false;res2是空数组(真值),返回true。答案:false、true。
题型5:判断变量是否为假值(实战题)
// 需求:判断变量val是否为假值,若是则输出“假值”,否则输出“真值”
function checkFalsy(val) {
// 请补充代码
}
// 测试用例
checkFalsy(0); // 假值
checkFalsy(''); // 假值
checkFalsy([]); // 真值
checkFalsy(null); // 假值
checkFalsy(' '); // 真值
解析:核心是判断val是否属于6个假值之一,代码实现:
function checkFalsy(val) {
const falsyList = [false, 0, '', null, undefined, NaN];
// 注意:NaN不能用===判断,需单独处理
const isFalsy = falsyList.includes(val) || (typeof val === 'number' && isNaN(val));
console.log(isFalsy ? '假值' : '真值');
}
五、记忆技巧+避坑指南(面试必备)
1. 快速记忆法
假值6个,记口诀: “假零空,未定义,非数字” ,对应:
- 假:false
- 零:0、-0
- 空:''(空字符串)
- 未定义:undefined
- 非数字:NaN
补充:null对应“空值”,可归为“空”的范畴,方便记忆。
2. 高频避坑点(面试重点)
- ❌ 误区1:空数组([])、空对象({})是假值 → 正确:均为真值;
- ❌ 误区2:'0'、'false'是假值 → 正确:非空字符串,均为真值;
- ❌ 误区3:NaN === NaN → 正确:NaN !== NaN,判断需用isNaN();
- ❌ 误区4:null === undefined → 正确:二者均为假值,但严格相等为false(松散相等为true);
- ❌ 误区5:无效日期对象是假值 → 正确:日期对象是引用类型,无论有效与否,均为真值。
3. 实战技巧
快速判断一个值是真值还是假值,用双重非(!!) 转换为布尔值,简单高效:
// 快速判断
console.log(!!val); // true → 真值,false → 假值
六、总结
JS中真值与假值的核心的是:假值仅6个,其余全为真值。掌握这一核心规则,再记住高频易错点和面试题型,就能轻松应对开发中的逻辑判断和面试考查。
关键在于:不要凭“直觉”判断(如认为“空数组是空的,就是假值”),而是严格遵循JS的规定,结合实例多练习,强化记忆。建议把本文中的面试题型动手运行一遍,加深理解,避免踩坑。