JavaScript 中如何计算三元运算符?

发布于 2024-10-18 14:36:32 字数 372 浏览 1 评论 0原文

关于 JavaScript 中的三元 (? :) 运算符,我想知道典型浏览器的 JavaScript 解释器如何计算它:

替代方案 A:

  1. 计算第一个操作数。
  2. 如果第一个操作数的结果为 true,则计算并返回第二个操作数。
  3. 否则,计算并返回第三个操作数。

替代方案 B:

  1. 评估所有三个操作数。
  2. 如果第一个操作数的结果为 true,则返回第二个操作数的结果。
  3. 否则,返回第三个操作数的结果。

方案C:

当然,如果方案A和方案B都没有准确描述三元运算符的工作原理,请解释一下它是如何工作的。

Regarding the ternary (? :) operator in JavaScript, I would like to know how it is evaluated by a typical browser's JavaScript interpreter:

Alternative A:

  1. Evaluate the first operand.
  2. If the result of the first operand is true, then evaluate and return the second operand.
  3. Else, evaluate and return the third operand.

Alternative B:

  1. All three operands are evaluated.
  2. If the result of the first operand is true, return the result of the second operand.
  3. Else, return the result of the third operand.

Alternative C:

Of course, if neither alternative A nor alternative B accurately describe how the ternary operator works, please explain me how it works.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一梦浮鱼 2024-10-25 14:36:32

“替代方案 A”:

(1)? functionOne(): functionTwo()

如果您在两个函数上都放置一个简单的警报消息,则只有 functionOne 会显示其消息。

function functionOne(){ 
   alert("one");
}
function functionTwo(){ 
   alert("two");
}

The "alternative A":

(1)? functionOne(): functionTwo()

If you put a simple alert message on both functions, only functionOne will display its message.

function functionOne(){ 
   alert("one");
}
function functionTwo(){ 
   alert("two");
}
漫雪独思 2024-10-25 14:36:32

根据规范,它的工作方式类似于替代方案A

产生式 ConditionalExpression : LogicalOREExpression ? AssignmentExpression :AssignmentExpression 的计算如下:

  1. lref为计算LogicalORExpression的结果。
  2. 如果 ToBoolean(GetValue(lref))true,则
    • trueRef 为计算第一个 AssignmentExpression 的结果。
    • 返回GetValue(trueRef)
  3. 其他
    • falseRef 为计算第二个 AssignmentExpression 的结果。
    • 返回GetValue(falseRef)

According to the specification it works like in Alternative A:

The production ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression is evaluated as follows:

  1. Let lref be the result of evaluating LogicalORExpression.
  2. If ToBoolean(GetValue(lref)) is true, then
    • Let trueRef be the result of evaluating the first AssignmentExpression.
    • Return GetValue(trueRef).
  3. Else
    • Let falseRef be the result of evaluating the second AssignmentExpression.
    • Return GetValue(falseRef).
稀香 2024-10-25 14:36:32

三元运算符由于多种原因而延迟计算。

  1. 当您只返回 if 或 else 时,计算所有操作数的效率很低。
  2. 进行惰性计算允许您执行诸如 x != 0 ? 10 / x : 10; 如果它同时评估所有内容,如果 x 为零,您将得到除以零的错误

The ternary operator evaluates lazily for several reasons.

  1. It's inefficient to evaluate all the operands when you are only going to return either the if or the else
  2. Doing lazy evaluation allows you to do things like x != 0 ? 10 / x : 10; If it evaluated everything at the same time you would get a divide by zero error if x were zero
夏天碎花小短裙 2024-10-25 14:36:32

运行这个并找出:

function bool() {
    alert('bool');
    return false;
}

function a() {
    alert('a');
    return 'A';
}

function b() {
    alert('b');
    return 'B';
}

alert(bool() ? a() : b())

Run this and find out:

function bool() {
    alert('bool');
    return false;
}

function a() {
    alert('a');
    return 'A';
}

function b() {
    alert('b');
    return 'B';
}

alert(bool() ? a() : b())
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文