调试控制台支持在断点暂停时即时求值表达式,复用当前JS引擎上下文;Watch面板仅暂停时单次求值且不响应引用变化,需手动刷新。

调试控制台里直接输入表达式就能看到结果
只要程序在断点处暂停,调试控制台(Debug Console)就处于当前执行帧的作用域中,此时输入任意合法表达式,回车后立刻返回求值结果。这不是“运行代码”,而是复用当前 JS 引擎上下文做即时计算。
-
user.name、items.length这类简单访问最常用,也最安全 - 支持方法调用:
list.filter(x => x > 5),但注意别触发副作用(比如修改原数组或发请求) - 可选链和空值合并很实用:
response?.data?.items?.[0]?.id,避免Cannot read property 'data' of undefined - 复杂结构建议用
JSON.stringify(obj, null, 2)格式化查看,但大对象会卡顿,慎用
Watch 面板只在暂停时求值,且不支持语句
Watch 面板不是实时监听器,它只在每次断点暂停瞬间对每个表达式求一次值。写错语法或越界访问不会报错到整个面板,而是对应项显示 ReferenceError 或 undefined。
- 有效表达式:
typeof data === 'object' && data?.id、user.active ? 'online' : 'offline' - 无效写法:
console.log(user)(语句)、let x = 1(声明)、await fetch('/api')(顶层 await 不支持) - 如果变量是
let count = 0声明在断点行之后,Watch 里就看不到——得把断点下移一行,或改用 Debug Console 手动验证 - 监视
obj后执行obj.name = 'new',Watch 不会自动刷新,必须点右侧↻图标或重新暂停
调试控制台能改值、调用函数,但要小心副作用
Debug Console 比 Watch 更自由:它允许赋值、声明变量(临时)、甚至执行多行逻辑(用 Shift+Enter 换行),但它直接影响当前调试状态。
- 修改变量:
count = 100、user.role = 'admin',继续执行即可验证分支逻辑 - 重写函数(临时):
fetch = () => Promise.resolve({ ok: true }),适合 mock 网络响应 - 调用异步函数需手动加
await:await api.getUser(123)(前提是当前调试环境支持顶层 await) - 危险操作:执行
location.reload()、localStorage.clear()会真实影响页面状态,调试中务必确认后果
别指望 Watch 自动追踪引用变化
这是最常被误解的一点:Watch 显示的是“快照”,不是“响应式视图”。你监视一个对象或数组,它不会随代码运行自动展开新属性、更新 length 或反映深层变更。
- 监视
state.users,然后代码里state.users.push(newUser)→ Watch 中的length不变,除非手动点刷新 - 监视
obj,再执行obj.profile = { age: 30 }→ 展开树里看不到profile,得点击右侧箭头重新展开 - 真正需要动态观察的场景,不如在代码里加
console.log('watch:', { users: state.users.length, profile: obj.profile }),更可控也更明确


















