Node.js 的「关键字」层 = JavaScript 语言特性。本篇覆盖 Node 工程高频的语言机制(不含浏览器 API)。
1. let / const / var
描述
const 禁重赋值(对象内容仍可改);let 块级作用域;var 函数级+提升——新代码禁用 var。
语法和示例
const list = [1, 2]; // 引用不可换
list.push(3); // 合法
let n = 1; // 块级
{ let n = 2; } // 内层独立
// var a = 1; ✗:提升与循环闭包都是坑2. 箭头函数与 this
描述
箭头函数继承定义处 this;普通函数 this 由调用方式定。
语法和示例
const obj = {
name: 'A',
regular() { return this.name; }, // this=obj
arrow: () => globalThis.name, // 定义处(模块作用域)
delayed() { setTimeout(() => this.name, 100); }, // 正确继承
};3. 解构与默认值
描述
对象/数组解构、重命名、默认值、剩余收集。
语法和示例
const { a, b: renamed, c = 1, ...rest } = obj;
const [first, , third] = arr;
function f({ name, port = 3000 }) {}
const merged = { ...a, ...b };
const copy = [...list];4. 可选链与空值合并
描述
?. 深取安全;?? 只对 null/undefined 兜底(0/” 不触发)。
语法和示例
user?.profile?.name ?? '匿名';
user?.comments?.[0]?.text;
fn?.();
const port = env.PORT ?? 3000; // PORT=0 时保留 0(?: 会误兜底)5. 模板字符串与标签
描述
反引号插值;多行;标签函数高级用法。
语法和示例
const msg = `Hello ${user.name}, you have ${n} items`;
const sql = `SELECT * FROM t WHERE id = ${id}`;
const multi = `
line1
line2`;
String.raw`C:\new\path`; // 原始反斜杠6. async / await
描述
async 函数返回 Promise;await 只能在其内;错误用 try/catch。
语法和示例
async function load() {
try {
const res = await fetch(url);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (e) { log(e); throw e; }
}
const v = await load(); // 顶层 await(ESM)7. Promise 组合
描述
all 全成才成;allSettled 各自成败;race/any 取先。
语法和示例
const [a, b] = await Promise.all([f1(), f2()]);
const settled = await Promise.allSettled([risky(), safe()]);
settled.filter(s => s.status === 'fulfilled');
await Promise.race([task(), timeout(5000)]);8. class 与继承
描述
class 是原型的语法糖;static 字段;私有 # 前缀。
语法和示例
class Api {
#key; // 真私有
static VERSION = '1'; // 静态字段
constructor(key) { this.#key = key; }
get auth() { return `Bearer ${this.#key}`; } // getter
async call() { return fetch(u, { headers: { auth: this.auth } }); }
}
class V2 extends Api {
constructor(k) { super(k); }
}9. 迭代器与生成器
描述
Symbol.iterator 协议;function* 惰性产出。
语法和示例
function* range(n) { for (let i = 0; i < n; i++) yield i; }
[...range(3)]; // [0,1,2]
for (const x of range(5)) {}
async function* pages() { yield await p1(); }
for await (const pg of pages()) {} // 异步生成器10. 模块导入导出
描述
export 命名/默认;动态 import() 异步;node: 前缀强制内置。
语法和示例
export const A = 1;
export default class {}
import Def, { A as Alias } from './m.js';
const mod = await import('./heavy.js'); // 按需加载
import fs from 'node:fs/promises'; // 内置免歧义11. 严格相等与比较
描述
=== 无隐式转换;NaN 自身不等——Number.isNaN 判断。
语法和示例
1 === '1'; // false
Object.is(NaN, NaN); // true(=== 是 false)
Number.isNaN(x);
[2] == 2; // true(== 会拆箱——禁用)12. Symbol 与枚举模式
描述
Symbol 唯一键防冲突;enum 用 frozen 对象或 const。
语法和示例
const KEY = Symbol('k');
obj[KEY] = '私有键';
const Color = Object.freeze({ Red: 'red', Blue: 'blue' });
// TS 里用 enum / as const13. Proxy / Reflect
描述
拦截对象操作——校验、日志、响应式框架的底层。
语法和示例
const handler = {
get(t, k) { console.log('read', k); return Reflect.get(t, k); },
set(t, k, v) {
if (k === 'age' && v < 0) throw new RangeError();
return Reflect.set(t, k, v);
},
};
const safe = new Proxy(obj, handler);14. 错误类型
描述
TypeError/RangeError/SyntaxError;自定义继承 Error 带 cause。
语法和示例
class HttpError extends Error {
constructor(status, msg, options) {
super(`HTTP ${status}: ${msg}`, options); // cause 链(ES2022)
this.status = status;
}
}
throw new HttpError(404, 'not found', { cause: err });15. 位运算与数值
描述
位运算转 32 位整数;BigInt 任意精度。
语法和示例
5 & 3; 5 | 3; 5 ^ 3; ~5; // 位
1 << 10; // 1024
0b1010; 0o17; 0xff; // 二/八/十六进制
9007199254740993n; // BigInt(超安全整数)
Number.isSafeInteger(n);
(0.1 + 0.2).toFixed(2); // '0.30'