Z
ZHANK
流程控制

真值与假值

理解 truthy/falsy 概念、短路求值、空值合并

真值与假值

JavaScript 中每个值在布尔上下文中都有"真"或"假"的判定。

学完本章你将: 理解 truthy/falsy、短路求值、空值合并。


假值(Falsy)列表

JavaScript 只有 9 个假值:

javascript
// 9 个假值
console.log(Boolean(false));     // false
console.log(Boolean(0));         // false
console.log(Boolean(-0));        // false
console.log(Boolean(0n));        // false (BigInt)
console.log(Boolean(""));        // false
console.log(Boolean(null));      // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN));       // false

除此之外的所有值都是真值(truthy):

javascript
console.log(Boolean(" "));       // true(非空字符串)
console.log(Boolean("false"));   // true(字符串不是布尔值)
console.log(Boolean([]));        // true(空数组)
console.log(Boolean({}));        // true(空对象)
console.log(Boolean(-1));        // true(非零数字)

短路求值(Short-circuit)

javascript
// || 返回第一个真值(或最后一个假值)
console.log(null || "default");    // "default"
console.log("hello" || "world");   // "hello"
console.log(0 || NaN || "");       // ""

// && 返回第一个假值(或最后一个真值)
console.log(true && "hello");      // "hello"
console.log(false && "hello");     // false
console.log(1 && 2 && 3);          // 3

空值合并运算符 ??

javascript
// ?? 只在 null/undefined 时返回右侧
console.log(null ?? "默认");       // "默认"
console.log(undefined ?? "默认");  // "默认"
console.log(0 ?? "默认");          // 0(0 不是 null)
console.log("" ?? "默认");         // ""(空字符串不是 null)

// || 和 ?? 的区别
console.log(0 || "默认");          // "默认"(0 是 falsy)
console.log(0 ?? "默认");          // 0(0 不是 null/undefined)

可选链 ?.

javascript
let user = {
    name: "Alice",
    address: {
        city: "北京",
    }
};

// 安全访问深层属性
console.log(user?.address?.city);    // "北京"
console.log(user?.contact?.phone);   // undefined(不报错)

// 安全调用方法
console.log(user.getName?.());       // undefined

// 没有 ?.
// console.log(user.contact.phone);  // ❌ TypeError

实用模式

javascript
// 1. 默认值
function greet(name) {
    name = name || "游客";
    return `你好,${name}`;
}

// 2. 条件执行
let isLoggedIn = true;
isLoggedIn && renderDashboard();

// 3. 安全嵌套
let config = { theme: { color: "blue" } };
let color = config?.theme?.color ?? "默认颜色";
console.log(color); // "blue"