前端面试课程:学习目录与纠错记录
目前顯示中文(中國)原文
课程:方格前端讲面试 · 前端高频面试题,共 100 集,约 21.7 小时。
已整理 100 / 100 集。以下是笔记整理进度,不代表你的观看进度;未完整核对的分集保留为待整理。
每集至少一篇,复杂主题按概念与实现拆分。依据视频音轨转写、关键课件画面与相应文档核对;示例为便于复习整理的版本,不是逐字转录。笔记保留来源、回看定位、解释、示例与边界。
纠错与适用范围
- P001:let、const 的绑定初始化前处于 TDZ;“完全没有提升”不够严谨。顶层 var 与 window 的关系需要区分普通脚本和模块。
- P002:Object.prototype.toString 的标签可被 Symbol.toStringTag 改变,不能保证精确判断任意类型。
- P003:堆、栈、地址是教学示意,不是 JavaScript 规范对所有引擎的强制内存布局。
- P004:课件说 structuredClone 不能复制 Error 对象不正确;标准支持 Error 类型。克隆库也不等于能够复制函数闭包。
- P005:map、filter、reduce 本身不原地替换数组,不代表回调没有副作用;新数组也可能共享元素对象。
- P006:Object.keys、Reflect.ownKeys 按属性范围选用;性能没有跨引擎的固定排名,Reflect.ownKeys 不包含私有字段等内部状态。
- P007:普通对象在 default hint 下通常先 valueOf、后 toString;视频的默认顺序不准确。falsy 列表还需要包含 0n 等情况。
- P008:NaN 的比较要区分 ===、Object.is 与 SameValueZero;nullish 的简写在浏览器有 document.all 历史例外。
- P009:调用栈与词法环境不是同一条链;上下文出栈不等于闭包关联数据立刻销毁,闭包也不自动构成泄漏。
- P010:new 调用可构造的绑定函数会忽略已绑定 thisArg;浏览器定时器普通回调的 this 不能按普通严格独立调用推断。
- P013:时间戳节流不保证每周期“至少一次”;连续事件结束后也可能没有尾调用。拖拽结束应结合真正的结束事件。
- P014:临时挂方法模拟 call/apply 只是教学模型;冻结对象、严格 this、异常清理与 Proxy 都有边界。
- P016:口述把对象、数组参数说成按引用传递,与 P003 矛盾;应为按值传递并共享同一个对象。
- P017:再次 bind 仍能添加预设参数,只是不能替换第一次 this;instanceof 检测 new 和简化构造分支也不能完整模拟原生行为。
- P018:解构参数模式会计入 Function.length;默认参数截断计数,rest 不计入。
- P019:reduce 默认从左到右;只包装递归函数外层,不会自动缓存未经过包装器的递归子调用。
- P020:定时器不会自动把耗时运算移到其他线程;interval 不等待异步回调,轮询要明确完成、取消和错误策略。
- P021:浏览器渲染不是普通单队列中的宏任务;事件循环不会自动消除同步 CPU 阻塞,微任务也可能造成饥饿。
- P022:then(success, fail) 的 fail 不会捕获同一个 success 抛出的异常;resolve 与 fulfilled 也不能完全等同。
- P023:await 普通值也会暂停并异步恢复;Generator 是常见解释/转译模型,不是原生实现必须实际依赖的对象。
- P024:all、race 的完成不会自动取消其他任务;allSettled 还可能因输入迭代异常而拒绝。
- P025:setTimeout 只能模拟异步,不能模拟原生 Promise 的微任务顺序;教学状态机省略解析过程,不是完整兼容实现。
- P027:await 的拒绝在恢复当前函数时进入异常控制流,不等于最初调用 async 函数时同步向外抛错。return await 在局部捕错等情形有意义。
- P028:Node.js 11 以后 nextTick 与 Promise 也并非合并成同一个队列,不能把它们当作相同机制。
- P029–P031:并非每个函数都有 prototype;原型属性也不等于可构造能力。Object.create+apply 不能完整模拟 class、内建或绑定构造器的 new 语义。
- P032:instanceof 默认查原型链,不证明创建历史;自定义 Symbol.hasInstance 可使原始值返回 true,跨 realm 数组仍优先用 Array.isArray。
- P033:Object.create(null) 的真实原型是 null;读取 proto 得到 undefined 是另一个现象。描述符未声明的枚举、写入、配置标志默认 false。
- P034:super() 不是必须第一行,而是使用 this 前需要正确初始化;class 的完整语义也不等于普通构造函数的简单改写。
- P035:new Parent(arg) 可以传参,限制在公共原型建立阶段不能替每个未来实例单独初始化;super() 不等同 Parent.call(this)。
- P036:default-src 不覆盖全部 CSP 指令;有响应头不代表所有注入都被防住,nonce 也不能固定复用,未给依据的统计数字不当作事实。
- P037:刷新后内存下降、Detached 节点或闭包本身都不能单独证明泄漏;应验证长期保留路径及多轮清理后的增长。
- P038:MessageChannel 不受同一定时器嵌套钳制,不等于保证零延迟;动画与后台工作要按目标选择调度 API。
- P039:CORS 主要影响跨源读取,报错不代表请求一定没发送;许可头由响应提供,同源按协议、主机、有效端口判断。
- P040:事件总线仍有消息契约耦合;空闲回调一次跑完整队列也可能阻塞,批处理会改变时序语义。
- P041:React JSX 中每项 onClick 不等于每项都添加原生 DOM 监听;Portal 的 React 传播链与原生 DOM 传播路径应分别分析。
- P043–P045:Vue 对象代理与 ref 访问机制、响应式数据与 DOM 调度要区分;ref 也支持对象,computed 可有 setter,写只读 computed 不等于必然抛异常。
- P044:Composition API 与 React Hooks 是组织逻辑上的类比,不是生命周期、调用次数与依赖机制完全等价。
- P046:普通深层 reactive 对象属性会解包 ref,课件推荐 state.count.value++ 不正确;替换 ref.value 是受支持的用法,不应一概禁止。
- P047:defineProperty 能给部分已有数组索引定义访问器;Vue 2 的数组策略不能当作语言能力的全部限制,slice 也不是原地变异方法。
- P048:基础 track/trigger 示例还需要动态依赖清理、嵌套恢复、停止和调度;集合示意不是每个 Vue 版本源码的完整结构。
- P049:列表更新范围与组件结构有关,React 批处理不等于连续 setCount(count+1) 会累加五次;Vue 3.5 props 解构也有编译特例。
- P050:SSR 不执行 onMounted,正适合放客户端专用 DOM 逻辑;不能反过来说 window 因此禁止放在 onMounted。onUpdated 也应与 beforeUpdate 区分。
- P051:onInvalidate 是回调参数的命名,不应误当作通用导入 API;Vue 3.5 onWatcherCleanup 需同步注册。取消请求与阻止过期结果写入是不同层面的措施。
- P052:v-if/v-show 要区分初始与切换成本;稳定业务 key 主要保障动态列表身份,索引不是任何场景都语法禁止。
- P053:Vue 组件 emit 不会像 DOM 事件一样自动冒泡整个树;Vue 3 默认 v-model 约定为 modelValue/update:modelValue,不能与 Vue 2 value/input 混用。
- P054:provide/inject 按组件祖先与最近提供者作用,不是无范围全局总线;传 ref.value 的普通值也不会自动变成持续响应的注入。
- P056:父声明的插槽具有父词法作用域,加上显式 slot props;访问未提供变量的具体警告或异常要按表达式判断。
- P058:动态 params 可配置为可选或重复;路由 props 是到组件输入的映射,不是另一套任意复杂数据的 URL 通道。
- P059:守卫完整顺序包含最先的离开守卫与后续 resolve 等阶段;beforeRouteLeave 可访问已有实例,不能与 beforeRouteEnter 混同。前端守卫不替代后端授权。
- P060:route.meta 是匹配记录的非递归合并,设置元信息本身不会自动执行权限或缓存策略。
- P062:同一 Pinia 容器内通常共享实例,不代表不同应用或 SSR 请求共用一个全局实例。
- P063:Pinia 支持直接修改 state 和 $patch,并非只有 action 内才允许写入。
- P064:Pinia action 已绑定 store,允许直接解构调用;课件“永远不要解构 action”的建议不正确。
- P065:整体替换对象是受支持的数据语义;Object.assign 会保留旧字段,不能无条件作为正确替代。
- P066:局部选项名称是 directives;界面权限指令不等于服务端鉴权。
- P067:Vue 3 编译优化不限静态标记,旧式 with(this) 不能代表所有现代编译输出。
- P068:Vue 3 keyed diff 与 Vue 2 经典四端双端比较不同,涉及 LIS 等策略;key 的身份正确性不应只当作固定性能保证。
- P069:nextTick 等待相关 DOM 刷新,不是让状态赋值生效,也不保证屏幕已绘制,批处理由调度器完成。
- P071–P073:声明式与虚拟 DOM 不保证恒定复杂度或全局最小修改;DOM 写入也不是每次必然立即回流,JSX 花括号只接受表达式而非任意语句。
- P074:课件初始 count=0,setter 后安排读取当前闭包,三次独立点击应记录 0、1、2,而不是标注的 1、2、3。
- P075:React 不会因 props 原地修改而自动做深比较;也不应永远把 props 复制进 state,初始化后的同步语义需明确。
- P076:Fiber 是协作调度基础,不会抢占任意同步用户函数;并非所有更新都自动分片,commit 仍有阻塞成本。
- P077:key 首先表达同级身份,不是保证某种固定 DOM 操作次数或永远更快的开关。
- P078:React 17+ 的 React DOM 已取消旧事件池,现代代码通常不需要 persist 才能异步读取事件;视频混用了不同版本机制。
- P079:非受控可结合 FormData 和表单库,不必每项都有 ref;受控输入也能 ref 聚焦,文件输入还可程序清空而非任何写入都禁止。
- P080:复用自定义 Hook 不等于自动共享同一份状态。
- P081:StrictMode 的检查依版本和挂载位置,React 19 已移除部分旧 API,不宜仅记成仍可用的警告。
- P082:setter 不返回用于等待 DOM 的 Promise,当前渲染快照不原地变化;不能简单用异步或延迟二字涵盖全部调度。
- P083:函数式 updater 的复杂度取决于逻辑和队列,不是无条件常数;暴露原始 setter 也不能限制调用方只能函数式更新。
- P085:useState setter 也具有稳定身份,不是 useReducer dispatch 独有的性能优势。
- P086:拆 Context、稳定 children 只能减少特定通知来源,不能保证消费组件永远不再渲染。
- P087–P088:不必把所有局部状态塞进 Redux;无变化时 reducer/Immer 可保留引用,Immer 是结构共享而非全量深拷贝。
- P089:next(action) 不会自动等待后续 Promise;middleware API 与完整 store 实例也不能混为一谈。
- P090:Jotai 也支持不使用 Provider 的默认 store;Zustand 与 Jotai 均需注意 SSR/应用范围,组件外不能任意调用 Hook。
- P091:同 key 缓存不保证永远只请求一次或强一致;卸载后状态更新不自动等于内存泄漏,取消取决于任务配合。
- P092:Signals 不是统一纯 pull 模型,也不保证 React 组件永不重跑或性能默认最优,具体取决于库与渲染集成。
- P093:MCP 提供连接协议,不自动完成授权或重新训练模型;工具结果不能当作覆盖用户意图的指令。
- P094:原生 EventSource 与 fetch POST 读取 SSE 不同,自动重连和资源开销不能一概而论,网络 chunk 也不等于事件或 token。
- P095:官方 SDK、AI 应用 SDK、编排框架与生成界面产品属于不同层次;v0 不是普通 UI 组件库,长期服务密钥不应随浏览器代码公开。
- P096:刷新失败必须让所有等待请求结束,重放要有次数与幂等边界,刷新令牌轮换须保存新值;单页 refreshing 标志不能解决跨标签页及退出竞态。
- P097:并发池需在失败与同步 throw 时也释放额度;去重与结果缓存不是同一种机制,HTTP/2 也不代表任意并发都无成本。
- P098:TTL 是应用读取检查,localStorage 不主动到点删除;命名空间清理不应误删其他功能,示例也没有自动实现安全加密。
- P099:每次 interval 减固定间隔会因调度延迟累计漂移,应基于截止点重算,前端不能保证页面冻结时准点回调。
- P100:Proxy/fakeWindow 只隔离部分操作,嵌套共享对象与真实 DOM 等仍可互相影响;浅快照也不构成任意不可信代码的安全沙箱。