← 返回首页

🚀 后端开发者 JavaScript 学习指南

从后端视角快速掌握 JavaScript 核心概念和思维差异

一、思维转变

1. 单线程异步模型

后端熟悉的可能是多线程/多进程模型,但 JS 是单线程事件驱动

后端阻塞思维
// 线程阻塞等待
result = db.query(sql);
process(result);
JS 异步思维
// 回调方式
db.query(sql, (err, result) => {
    process(result);
});

// async/await(推荐)
const result = await db.query(sql);
process(result);

2. 原型链 vs 类

// 看起来像类(ES6 语法糖)
class User {
    constructor(name) {
        this.name = name;
    }
}

// JS 本质是原型链
// User.prototype 是所有实例共享的原型

3. 弱类型 vs 强类型

⚠️ 注意

JavaScript 是动态类型,运行时才检查类型错误。TypeScript 可以解决这个问题。

let x = 1;
x = "string";  // 合法

// TypeScript 中会报错
let x: number = 1;
x = "string";  // 编译错误

二、核心概念速通

📦 闭包(Closure)

函数记住并访问其词法作用域的能力,类似后端的闭包对象。

function createCounter() { let count = 0; return { increment: () => ++count }; }

🎯 this 绑定

箭头函数词法绑定,普通函数动态绑定。

getValue: () => this.value vs getValue() { return this.value; }

🔓 解构与展开

类似后端的 destructuring 和 spread 操作。

const { name, age } = user; const merged = { ...obj1, ...obj2 };

🔄 数组高阶函数

函数式编程风格,链式调用。

users.filter(u => u.active).map(u => u.name)

三、异步编程演进

💡 演进历程

回调 → Promise → async/await

1. 回调地狱(避免)
getData((a) => {
    getMoreData(a, (b) => {
        getEvenMoreData(b, (c) => {
            // ...
        });
    });
});
2. Promise 链式
getData()
    .then(a => getMoreData(a))
    .then(b => getEvenMoreData(b));
// 3. async/await(推荐,类似同步代码)
try {
    const a = await getData();
    const b = await getMoreData(a);
    const c = await getEvenMoreData(b);
} catch (e) {
    // 错误处理
}

// 4. Promise.all(并发)
const [users, posts] = await Promise.all([
    fetchUsers(),
    fetchPosts()
]);

四、Node.js 后端开发要点

1. 模块系统

ES Module(推荐)
import express from 'express';
export const handler = (req, res) => {};
CommonJS(旧)
const express = require('express');
module.exports.handler = (req, res) => {};

2. Event Loop

┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ poll (I/O) │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ check │ │ └─────────────┬─────────────┘ └──│ close callbacks │ └───────────────────────────┘

3. Stream 流处理

// 类似后端的流式处理
readStream
    .pipe(transformStream)
    .pipe(writeStream);

五、TypeScript 必备

// 1. 接口定义
interface User {
    id: number;
    name: string;
    email?: string;  // 可选
}

// 2. 泛型
function identity<T>(arg: T): T {
    return arg;
}

// 3. 类型守卫
function isString(value: unknown): value is string {
    return typeof value === 'string';
}

// 4. 工具类型
type PartialUser = Partial<User>;
type ReadOnlyUser = Readonly<User>;
type UserId = Pick<User, 'id'>;

六、学习路径建议

阶段 内容 时间
1 语法基础(变量、函数、数据类型) 1-2 天
2 异步编程(Promise、async/await) 2-3 天
3 Node.js 基础 + Express 3-5 天
4 TypeScript 入门 2-3 天
5 实战项目 1-2 周

七、常见坑

⚠️ 变量提升
console.log(x);  // undefined,不是报错
var x = 1;
⚠️ 相等比较
[] == []   // false(引用比较)
[] === []  // false
'' == 0    // true(类型转换)
ℹ️ 事件循环顺序
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// 输出:1, 4, 3, 2(微任务优先)

八、推荐资源

  • MDN Web Docs - 官方文档,最权威的参考
  • JavaScript 高级程序设计(第 4 版) - 经典书籍,系统学习
  • You Don't Know JS - 深入理解 JS 本质
  • Node.js 设计模式 - 后端开发参考