一、 JavaScript 简介与生态
本章节主要介绍了 JavaScript 的起源、发展历程以及在现代技术栈中的地位。
- 发展背景:
- 由 Netscape 公司的 Brendon Eich 在10天内设计完成,初名 LiveScript。
- 设计上参考了 C、Java、Scheme 和 Self 语言,早期设计较为仓促。
- 标准化: 1997年 ECMA 发布 ES1 标准,2009年 ES5 发布(现代 JS 基础),2015年 ES6 发布(引入 Promise 等重大特性)。
- 前端三剑客关系:
- HTML (结构层): 骨骼与躯体。
- CSS (表现层): 衣服与装饰。
- JavaScript (行为层): 行为与动作。
- 全能的应用领域:
- 前端: React, Vue, Angular。
- 后端: Node.js。
- 桌面端: Electron (如 VS Code)。
- 物联网/数据库/移动端: Arduino, MongoDB Shell, React Native。
二、 JavaScript 核心语法
本章节详细讲解了 JS 的基础语法,重点强调了数据类型、拷贝机制及函数特性。
1. 数据类型
- 基本类型: Object, Number (不分整型浮点型), String, Boolean, null, undefined。
- ES6 新增类型: Map (键可为任意类型), Set (去重数组)。
- 深拷贝与浅拷贝 (重点):
- 浅拷贝: 只复制引用地址,修改新对象会影响原对象。
- 深拷贝: 完全克隆,新旧对象互不影响。
- null 与 undefined 的区别: null 表示空值,undefined 表示未定义。推荐赋值用 null,比较用
===。
2. 控制流
- 循环: while, for, map (返回新数组), forEach (无返回值)。
- 条件判断: if / else。
3. 函数
- 定义方式:
- 函数声明:
function foo() {}(存在函数提升,优先加载)。 - 函数表达式:
const foo = function() {}(遵循变量执行顺序)。 - 匿名函数: 常见于代码混淆。
- 函数声明:
- 变量作用域:
var:函数作用域,存在变量提升。let/const(ES6):块级作用域,无变量提升。
- 高阶函数: 接收函数作为参数的函数,常用于回调。
- 闭包 (Closure):
- 定义: 函数返回函数,且内部保留了参数和变量的引用。
- 用途: 匿名自执行函数、封装私有变量、结果缓存。
- 逆向场景: 面试题经典考点(循环+setTimeout),也是逆向分析中常见的混淆手段。
4. 特殊对象
- JSON:
JSON.stringify(序列化),JSON.parse(反序列化)。 - Date: 时间处理对象。
三、 JavaScript 进阶知识
1. 事件循环 (Event Loop)
- 机制: JS 是单线程的,通过事件循环处理异步操作。
- 结构: 堆 (Heap)、栈 (Stack)、队列 (Queue)。
- 流程: 主线程执行同步代码 -> 异步任务放入队列 -> 主线程空闲时从队列读取任务执行。
2. 原型链 (Prototype Chain)
- 核心属性:
prototype(原型),__proto__(实例指向原型的指针),constructor(构造函数)。 - 查找机制: 访问属性时,先找自身,找不到则顺着
__proto__向上查找,直到顶层。 - 逆向意义: 即使 ES6 引入了
class语法糖,Babel 转译后的代码(ES5)依然基于原型链,理解它对于阅读逆向代码至关重要。
3. 异步编程演进
- 回调函数 (Callback): 早期方案,易导致“回调地狱”,代码可读性差。
- Promise (ES6): 链式调用 (
.then,.catch),解决了回调地狱,支持Promise.all并行。 - Async / Await (ES8): 基于 Promise 的语法糖,使异步代码看起来像同步代码,可读性最高。
4. 浏览器存储
- Cookies: 随请求发送,容量小 (4KB)。
- LocalStorage: 容量较大 (5MB),持久存储。
- SessionStorage: 仅当前会话有效,关闭窗口即丢失。
- IndexedDB: 浏览器端的 SQL 数据库,容量大,结构化存储。
5. 跨域 (Cross-Origin)
- 定义: 浏览器同源策略限制。
- 解决方案:
- CORS: 官方标准,后端设置响应头。
- JSONP: 利用
<script>标签特性,仅支持 GET。 - Iframe + PostMessage。
- 反向代理 (Nginx): 隐藏后端端口,安全性较高。
6. Webpack 打包
- 作用: 将模块化开发的前端项目(JS, TS, SCSS 等)编译打包成浏览器可识别的静态文件。
- 关联: 现代前端网站大多使用 Webpack 打包,理解其加载机制(加载器、插件)非常重要。