【问题标题】:JS && precedence vs ===JS && 优先级 vs ===
【发布时间】:2016-04-10 12:32:30
【问题描述】:

根据 javascript documentation=== 运算符的优先级高于 && 运算符。因此,我希望像

这样的表达式

false && undefined.foo() === undefined.foo()

在评估任一undefined.foo() 调用时抛出错误。但是,正如我在 node、chrome 和 firefox 中尝试过的那样,js 引擎总是短路并返回 false,例如

> false && undefined.foo() === undefined.foo()
false

&& 是否应该在 评估 === 操作数之后触发短路?

【问题讨论】:

    标签: javascript node.js operators


    【解决方案1】:

    较高的优先级仅仅意味着两个操作数 undefined.foo() 在决定 && 的操作数之前首先与 === 运算符相关联。它没有规定执行顺序,仍然是从左到右。

    运算符优先级仅决定表达式是否计算为

    (false && undefined.foo()) === undefined.foo()
    

    false && (undefined.foo() === undefined.foo())
    

    在任何一种情况下,false 仍然是要评估的第一件事;尽管如果 && 具有更高的优先级(第一个括号中的示例),那么第二个 undefined 表达式也将被评估。

    【讨论】:

    • 谢谢,这很有道理!
    【解决方案2】:

    为了更好地可视化为什么要以这种方式解析优先级,请根据解释器对优先级的排序方式添加可选括号:

    ( (false) && ( undefined.foo() === undefined.foo() ) )

    因为=== 的优先级高于&&,所以首先在undefined.foo() === undefined.foo() 表达式周围添加括号。由于现在已经确定了优先级,JavaScript 解释器现在将从左到右解析它。由于short-circuit evaluationundefined.foo() 比较表达式永远不会被评估,因为条件在评估 false 时退出

    【讨论】:

    • 我认为它的短路而不是懒惰的评估。 stackoverflow.com/questions/14908548/…
    • 我一直以为这只是所谓的懒惰评估。但我现在看到它是“短路”,因为它提前退出。但它也永远不会在需要之前评估剩余的表达式,使其变得懒惰。似乎懒惰和短路在它们之间有一条非常细的灰线。
    • 惰性求值有一个非常具体的含义,Javascript实际上不支持这种东西。考虑一个对 infinite 列表(或者只是一个无限列表本身)的map 操作;这只能通过惰性评估来实现,这将推迟实际评估直到实际需要结果(伪示例:print(infList.map(foo)[0])),否则map 将永远不会完成。
    • en.wikipedia.org/wiki/Lazy_evaluation#Control_structures 部分更多地关注控制结构体,但表示“布尔控制结构的短路评估有时被称为惰性”。然而,短路维基专门适用于实际参数的评估。看来我被教错了!更新了我的答案。感谢您对此的关注。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多