【问题标题】:Javascript ternary operator and assignmentJavascript 三元运算符和赋值
【发布时间】:2011-07-02 02:27:22
【问题描述】:

对于这个简单的 JavaScript 赋值语句,我得到了意想不到的结果:

var t = 1 == 1 ? 1 : 0;
undefined

我本来希望将 1 分配给 t。如果你这样做,结果相同

var t = (1 == 1 ? 1 : 0);
undefined

有人可以解释为什么这不能按预期工作吗?

【问题讨论】:

  • 您是在控制台中执行此操作吗?如果是这样,只需在分配代码后键入t 即可查看t 的实际值。我知道 WebKit 控制台的行为是这样的。
  • 这与操作者无关,它必须处理不了解调试器是如何工作的。

标签: javascript variable-assignment ternary


【解决方案1】:

在 Firebug 控制台中评估 var t = 1 == 1 ? 1 : 0; 的结果将是 undefined。但是,t 的值将是 1,正如预期的那样。分配后尝试输出t

当变量声明位于单独的行时,Firebug 打印结果:

var t;
t = 1 == 1 ? 1 : 0;

这是因为赋值操作的返回值就是被赋值的值。但是,当存在var 关键字时,返回的是VariableStatement 声明的值,其行为如下:

产生 VariableStatement : var 变量声明列表;被评估 如下:评估 变量声明列表。返回 (正常、空、空)。

Return (normal, empty, empty). 指的是 JavaScript 内部识别的类型,而不是会打印到控制台的类型。

进一步阅读:

http://ecma262-5.com/ELS5_HTML.htm#Section_12.2

【讨论】:

    【解决方案2】:

    完美运行:

    > var t = 1 == 1 ? 1 : 0;
    undefined
    > t
    1
    

    你可以说赋值操作的返回值是undefined,而不是t的值。


    编辑: 但其实if I read the specification correctly,好像应该是返回表达式的值。

    作为@T.J.克劳德提到,似乎var 负责undefined 值。但这并不意味着您不应该使用var。您编写的代码是 100% 正确的。

    这更多地涉及到语言的内部工作,我认为这不是你感兴趣的。关于这方面的更多信息,请查看 cmets。

    【讨论】:

    • 其实一个赋值操作的值就是被赋值的值。然而,var 关键字显然妨碍了控制台。 (由于var 不能出现在表达式的右侧,这并不让我感到惊讶;似乎是处理控制台方面的有效方法。)
    • @TJCrowder:没错,似乎是var。感谢您的洞察力。
    • 发生的情况是var语句返回一个没有值的正常完成赋值操作的值显然是赋值表达式,eg:var a; alert(a = 'foo'); alert(a); 会提示'foo' 两次... 前段时间写了一篇关于completion type的文章,还没来得及写完,这里一个旧的draft
    • @TJCrowder, @CMS:我刚看了this part of the specification,上面写着评估返回(normal, empty, empty),所以我想这就是你所说的“正常完成”(这我可以在查看您的草稿后确认)。谢谢你!
    • @CMS:我再次注意到我不应该谈论太多我没有完全洞察力的事情;)
    【解决方案3】:

    在旧的 javascript 解析器中,我们需要在括号中结束条件:

    var t = (1 == 1) ? 1 : 0;
    

    【讨论】:

    • 自 1996 年以来,我一直在浏览器实现中使用 JavaScript。我从未见过有人将优先顺序弄错。你有这方面的资料吗?
    【解决方案4】:

    这段代码运行良好:

    var t = 1 == 1 ? 1 : 0;
    alert (t);
    

    检查here。它显示 1

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 2015-08-24
      • 2012-02-14
      • 2021-04-29
      • 2021-11-23
      • 2014-02-12
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多