Web 前端手册WEB FRONTEND

CHAPTER 02语言层 · LANGUAGE

JavaScript / TypeScript

ES2020+ 语法、类型系统、模块化、异步与错误处理。写出健壮、可维护、可协作的前端逻辑。

开始阅读难度入门先修第一章约2.5小时
02.1

现代语法特性

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。

02.2

模块化

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));
02.3

类型入门

TypeScript 给 JS 加静态类型,编译期发现错误。基本类型、数组、联合类型、字面量类型是日常基础。

let count: number = 0;
let name: string | null = null;     // 联合类型
const status: 'idle' | 'loading' = 'idle';  // 字面量
02.4

接口与泛型

用 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 还是 interface

描述对象/类形状两者皆可;需要联合、映射类型、工具类型时用 type 更灵活。团队统一约定即可。

02.5

异步与事件循环

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

漏写 await 会得到 Promise 而非结果,后续当值用会得到 [object Promise]。异步链每一步都要 await。

02.6

错误处理

用 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); }
02.7

类型收窄

typeof/instanceof/in 与自定义类型守卫能在分支里把宽类型收窄,获得精准提示,避免强制断言。

function format(v: string | number) {
  if (typeof v === 'string') return v.toUpperCase(); // 此处 v 是 string
  return v.toFixed(2);                                 // 此处 v 是 number
}
02.8

常见陷阱与 FAQ

var、let、const 怎么选?

默认用 const,需要重新赋值才用 let;避免 var(函数作用域、变量提升易出错)。

any 多了怎么办?

开 strict 与 noImplicitAny,逐步把 any 换成具体类型或 unknown + 守卫,恢复类型保护。

== 还是 ===?

一律用 ===(严格相等,不隐式转换)。== 的类型强制转换常带来意外结果。

02.9

实战练习与资源

延伸资源