前言
JavaScript 从现象到本质的思维旅程
第一章:重新理解那些“熟悉”的概念
- 再探闭包
它真的是“函数+外部变量”吗?闭包的真正载体是什么? - 词法作用域
为什么说作用域是“静态”的?它和作用域链有何区别? - 再探执行上下文
VO、AO、LexicalEnvironment:执行上下文的三重结构解析 - 内部槽(Internal Slot)
[[Environment]]、[[Prototype]]:JS 对象背后的隐性契约 - 变量提升的本质是什么?
Hoisting 是假象,真正的秘密在“声明阶段”与“初始化时机” - 暂时性死区(TDZ)的真相
为什么 let/const 有 TDZ?V8 是如何实现这一限制的? - 作用域链的构建时机
是函数调用时才链接?还是定义时就确定?with如何破坏它?
第二章:解构语言的“行为协议”
- this 的本质
它不是关键字,而是执行上下文中的一个动态绑定 - 被忽视的协议
[[Call]]、[[Construct]]:函数为何既能调用又能构造? - 箭头函数的设计哲学
为何没有自己的this?它如何改变调用协议? - 如何理解 arguments
伪数组背后的绑定机制:它为何能“实时响应”参数变化? - new 操作符详解
从[[Construct]]到原型绑定,一步步拆解对象创建过程 - call/apply/bind 详解
如何手动控制this绑定?bind 的“硬绑定”与“柯里化”特性 - 构造器返回值的诡异行为
如果构造函数return {}或return 1,结果会怎样?
第三章:穿透类型与对象的表象
- 深拷贝 vs 浅拷贝
值复制还是引用穿透?递归与循环引用的破解之道 - Object.create(null) 的特殊意义
为何它是“最干净”的对象?在 Map 前时代如何模拟哈希表? - 属性描述符与不可变性
configurable、writable、enumerable:如何真正“冻结”一个对象? - in 操作符与原型链查找
为什么'toString' in obj为 true?它的查找路径是怎样的? - hasOwnProperty 的边界情况
它真的能安全判断自有属性吗?什么情况下会失效?
第四章:探索语言的“元能力”与底层机制
- Symbol.toPrimitive:类型转换的终极控制权 // JsQuestions/Part18.md 如何自定义对象转原始值的行为?
+obj背后的调用逻辑 - valueOf 与 toString 的优先级之争 // JsQuestions/Part19.md 什么时候先调用谁?数字运算 vs 字符串拼接的差异
- Proxy:拦截对象的十三种行为
如何实现负索引数组、链式调用、自动深响应? - Reflect:与 Proxy 配套的“默认操作”API
为什么Reflect.get(target, key, receiver)需要 receiver? - 迭代协议:for...of 背后的隐藏接口
Symbol.iterator如何让对象变得“可迭代”? - 异步迭代器与生成器的融合
async function*返回什么?如何实现流式数据处理?
第五章:揭秘引擎与运行时细节
- 事件循环再思考:宏任务与微任务的优先级
Promise.then一定比setTimeout快吗?Node.js 与浏览器的差异 - 微任务队列的执行时机
为什么Promise.resolve().then()能“插队”? - JavaScript 内存模型初探
栈、堆、V8 的老生代与新生代分配策略 - 闭包与内存泄漏的真实关系
何时该主动释放引用?Chrome DevTools 如何分析 retainers? - 尾调用优化(TCO)为何在 JS 中受限?
什么是 proper tail calls?为什么 V8 几乎不支持?
补充说明:
- 新增内容均来自 JS 语言规范核心机制,如内部槽、协议、转换规则、引擎行为等,避免泛泛而谈。
- 标题延续你原有风格:使用“再探”“本质”“详解”“被忽视”“真相”“哲学”等词,增强辨识度与吸引力。
- 逻辑递进清晰:从基础认知 → 行为协议 → 对象模型 → 元编程 → 引擎运行,层层深入。
- 可扩展性强:后续还可加入
Temporal Dead Zone 实现原理、V8 Hidden Class 演示、JIT 去优化陷阱等更硬核主题。