Javascript 三元运算符和赋值

Posted

技术标签:

【中文标题】Javascript 三元运算符和赋值【英文标题】:Javascript ternary operator and assignment 【发布时间】: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 控制台的行为是这样的。 这与操作者无关,它必须处理不了解调试器是如何工作的。 【参考方案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

【讨论】:

以上是关于Javascript 三元运算符和赋值的主要内容,如果未能解决你的问题,请参考以下文章

三元条件和赋值运算符优先级

三元运算符

右侧的三元/空合并运算符和赋值表达式?

赋值运算符左侧的三元条件运算符

JavaScript-运算符

为啥带赋值的三元运算符不返回预期的输出?