You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中&&运算符优先级、执行顺序及代码报错问题咨询

为什么会报result is not defined?聊聊JavaScript中&&的优先级与执行顺序

兄弟,你踩的这个坑本质上是运算符优先级在搞鬼,跟你以为的“从左到右顺序求值”不是一回事!

先给你拆解原始代码的执行逻辑:

while ( result = iterator.next() && !result.done ) {
  console.log( result.value )
}

你可能以为这段代码会先把iterator.next()的结果赋值给result,再判断!result.done,但实际上,JavaScript里&&的优先级比赋值运算符=高得多——&&的优先级是6,=只有3。所以这个表达式会被JS引擎自动解析成:

result = (iterator.next() && !result.done)

那具体执行顺序就变成了:

  1. 先执行iterator.next(),拿到迭代器的结果对象(比如第一次是{value: 's', done: false})
  2. 接下来要计算&&右边的!result.done——但这时候result还没被赋值过啊!它根本不存在,JS引擎自然就抛出ReferenceError: result is not defined了。

再看你修改后的代码:

while ( ( result = iterator.next() ) && !result.done ) {
  // ...
}

这里的括号()强制改变了执行顺序,让赋值操作result = iterator.next()先完成:

  1. 先把iterator.next()的结果赋值给result,现在result是一个有value和done属性的对象了
  2. 再用这个已经存在的result去判断!result.done,逻辑就完全通顺了,自然不会报错。

简单总结一下:

  • 不要想当然地依赖“从左到右”的执行顺序,运算符优先级才是决定表达式执行顺序的核心
  • 当赋值操作和逻辑运算符混合时,一定要用括号明确你想要的执行顺序,避免优先级坑

内容的提问来源于stack exchange,提问作者coool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:25:01