这三种方法是浏览器强制同步阻塞的交互入口,confirm仅返回true或false(无null),prompt返回字符串或null(空串与null不同),alert返回undefined且不可中断。
这三种方法不是“可选”,而是浏览器强制提供的同步阻塞式交互入口——只要调用,JS 执行就停住,页面完全冻结,直到用户点完按钮。别想着绕开这个机制,得顺着它设计逻辑。
confirm 只返回 true 或 false,不会返回 null。这点和 prompt 有本质区别,常被误判导致逻辑分支出错。
true
false
if (result === null) 这类判断,它永远不成立prompt(title, default) 的 default 参数必须显式传,哪怕传空字符串 ''。否则在 IE 或旧版 Edge 中,输入框会显示 undefined 字样,不是留空。
prompt('用户名', '') 或 prompt('用户名', 'guest')
prompt('用户名') → IE 显示 “undefined” 文本,用户可能误以为是提示null(点取消 / Esc)'' 和 null 是不同值,if (input) 会把 '' 当作 false,需用 input !== null 显式判断alert 返回 undefined,但它最危险的地方不在返回值,而在它的不可中断性。连续调用多个 alert,用户必须一个个点完,中间无法跳过或关闭全部。
alert 会打断异步流程,比如放在 setTimeout 或 Promise 回调里,容易掩盖真实执行顺序for (let i = 0; i 会弹出 10 次,且无法批量关闭
alert 合并或静默丢弃,行为不一致console.log,上线前删掉所有 alert,真要提示请用 DOM 自定义弹层真正难处理的不是语法,而是它们对执行流的绝对控制——你没法监听关闭事件,没法加 loading,没法阻止重复触发。一旦进入 prompt,连 beforeunload 都被挂起。所以别试图“增强”它们,该用就用,该换就得换。