Javascript三元运算符和赋值

far*_*idz 23 javascript variable-assignment ternary

我得到了这个简单的JavaScript赋值语句的意外结果:

var t = 1 == 1 ? 1 : 0;
undefined
Run Code Online (Sandbox Code Playgroud)

我原本希望将1分配给v代替.如果你这样做,结果相同

var t = (1 == 1 ? 1 : 0);
undefined
Run Code Online (Sandbox Code Playgroud)

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

Way*_*ett 22

var t = 1 == 1 ? 1 : 0;比如说,Firebug控制台的评估结果将是undefined.但是,价值t1如预期.尝试t在分配后输出.

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

var t;
t = 1 == 1 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

这是因为赋值操作的返回值是指定的值.但是,当var关键字出现时,返回的是VariableStatement声明的值,其行为如下:

生产VariableStatement:var VariableDeclarationList ; 评估如下:评估 VariableDeclarationList.返回(正常,空,空).

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

进一步阅读:

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


Fel*_*ing 10

它完美地运作:

> var t = 1 == 1 ? 1 : 0;
undefined
> t
1
Run Code Online (Sandbox Code Playgroud)

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


编辑:但实际上如果我正确地阅读了规范,它似乎应该返回表达式的值.

正如@TJ Crowder所提到的那样,它似乎varundefined价值负责.但这并不意味着你不应该使用var.您编写的代码是100%正确的.

这更多地涉及语言的内部运作,我认为这不是你感兴趣的内容.有关这方面的更多信息,请查看评论.

  • 实际上,*赋值运算*的值是赋值.然而,`var`关键字显然妨碍了游戏机的使用.(因为`var`不能出现在表达式的右侧,这不会让我感到惊讶;似乎是处理控制台方面的有效方法.) (3认同)
  • 会发生的是`var`语句返回没有值的*normal completion*,赋值操作*的*值显然是赋值表达式的值,例如:`var a; 警报(a ='foo'); 警告(a);`将两次提醒''foo'...前段时间我正在写一篇关于*完成类型*的文章,但我还没有时间完成它,这里是一个旧的[草稿]( http://j.mp/gI9IRv). (2认同)