原始类型在异步编程中不可变,但可安全作为promise的resolve值、状态标识或流程分支依据;需避免闭包捕获过期变量,优先用===比较并校验类型。

JS 原始类型(如 string、number、boolean、null、undefined、symbol、bigint)在异步编程中本身不可变,也不能被直接“更新”或“共享状态”,但它们常作为中间值参与异步流程。关键不在于“改变原始值”,而在于**如何安全、清晰、可预测地把原始类型的值从异步操作中传出、传递、组合或用于控制逻辑**。
原始类型天然适合做 Promise 的 resolve 值
Promise 的 resolve(value) 接收任意值,原始类型是最轻量、最安全的返回内容:
- 不会产生引用歧义(不像对象/数组可能被意外修改)
- 序列化友好(JSON.stringify 安全,无循环引用风险)
- 适合做状态码、标识符、简单结果(如
resolve("success")、resolve(200)、resolve(true))
示例:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
setTimeout(() => res(200), 500);
});
fetchStatus().then(code => {
if (code === 200) console.log("请求成功");
});
避免在回调/闭包中意外捕获过期原始值
原始类型按值传递,但若在循环或定时器中闭包捕获变量,容易因变量重赋值导致“看似传错”:
- 错误写法(所有 setTimeout 共享同一个 i,最终输出全是 3):
for (var i = 0; i setTimeout(() => console.log(i), 100); // 输出 3, 3, 3
} - 正确做法:用 let(块级作用域)或显式绑定:
for (let i = 0; i setTimeout(() => console.log(i), 100); // 输出 0, 1, 2
}
用原始类型驱动 async/await 流程分支
原始值非常适合做 await 后的判断依据,让异步逻辑更语义化:
- 返回字符串状态,统一处理不同结果:
async function login() {
const res = await api.login();
switch(res.status) {
case "ok": return "logged_in";
case "expired": return "token_expired";
default: return "error";
}
}
const state = await login();
if (state === "logged_in") { /* 跳转首页 */ } - 数字型 code 可直接参与比较,无需解构对象
注意隐式转换带来的陷阱
原始类型在异步链中参与运算时,容易因 JS 类型转换引发意外行为:
-
Promise.resolve("0").then(x => x == false)→ true("0" == false 是真,但通常不是你想要的) - 建议始终用严格相等 ===,尤其在判断 success/error 状态时
- 对用户输入或接口返回的原始值,先校验再使用:
if (typeof code === 'number' && !isNaN(code)) { /* 安全使用 */ }










