现代语法特性
ES2015+ 引入的解构、模板字符串、可选链 ?.、空值合并 ??、扩展运算符让代码更简洁安全。
const user = { name: 'A', addr: { city: 'B' } };
const { name, addr: { city } } = user; // 解构
const greet = `hi ${name}`; // 模板串
const city2 = user.addr?.city ?? '未知'; // 可选链 + 空合并|| 把 0/''/false 都当空;?? 只在 null/undefined 时回退。计数场景用 ?? 避免误判 0。
模块化
ES Module 用 import/export 组织代码,浏览器原生支持,构建工具进一步做 tree-shaking。
// math.js
export const add = (a, b) => a + b;
// app.js
import { add } from './math.js';
console.log(add(1, 2));类型入门
TypeScript 给 JS 加静态类型,编译期发现错误。基本类型、数组、联合类型、字面量类型是日常基础。
let count: number = 0;
let name: string | null = null; // 联合类型
const status: 'idle' | 'loading' = 'idle'; // 字面量接口与泛型
用 interface/type 描述数据结构;泛型让函数/组件参数化,类型安全且可复用。
interface User { id: number; name: string; }
function first<T>(arr: T[]): T | undefined { return arr[0]; }
const u = first<User>([{ id: 1, name: 'A' }]);描述对象/类形状两者皆可;需要联合、映射类型、工具类型时用 type 更灵活。团队统一约定即可。
异步与事件循环
JS 单线程,异步靠事件循环。回调→Promise→async/await 一路演进;微任务(Promise)先于宏任务(setTimeout)执行。
async function load() {
try {
const res = await fetch('/api/user');
return await res.json();
} catch (e) {
console.error(e);
}
}漏写 await 会得到 Promise 而非结果,后续当值用会得到 [object Promise]。异步链每一步都要 await。
错误处理
用 try/catch 包裹可能失败的异步调用;用类型守卫把 unknown 收窄为具体类型,避免随意 any。
function isError(e: unknown): e is Error {
return e instanceof Error;
}
try { risky(); }
catch (e) { if (isError(e)) console.log(e.message); }类型收窄
typeof/instanceof/in 与自定义类型守卫能在分支里把宽类型收窄,获得精准提示,避免强制断言。
function format(v: string | number) {
if (typeof v === 'string') return v.toUpperCase(); // 此处 v 是 string
return v.toFixed(2); // 此处 v 是 number
}常见陷阱与 FAQ
默认用 const,需要重新赋值才用 let;避免 var(函数作用域、变量提升易出错)。
开 strict 与 noImplicitAny,逐步把 any 换成具体类型或 unknown + 守卫,恢复类型保护。
一律用 ===(严格相等,不隐式转换)。== 的类型强制转换常带来意外结果。