流程控制
真值与假值
理解 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"