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 三元运算符和赋值的主要内容,如果未能解决你的问题,请参考以下文章