我在这个简单的JavaScript赋值语句中得到了意外的结果:
var t = 1 == 1 ? 1 : 0;
undefined
我本来期望t被赋值为1。如果您执行以下操作,结果相同。
var t = (1 == 1 ? 1 : 0);
undefined
有人能解释一下为什么这个没有按预期工作吗?
我在这个简单的JavaScript赋值语句中得到了意外的结果:
var t = 1 == 1 ? 1 : 0;
undefined
var t = (1 == 1 ? 1 : 0);
undefined
var t = 1 == 1 ? 1 : 0;
,结果会显示undefined
。但是,t
的值将如预期一样为1
。尝试在赋值后输出t
。var t;
t = 1 == 1 ? 1 : 0;
var
关键字时,返回的是VariableStatement声明的值,其行为如下:
其中产生式VariableStatement:var VariableDeclarationList; 的评估结果如下:评估 VariableDeclarationList。返回(normal,empty,empty)。
返回(normal,empty,empty)
是JavaScript内部识别的一种类型,而不是会打印到控制台上的内容。它完美地工作:
> var t = 1 == 1 ? 1 : 0;
undefined
> t
1
undefined
,而不是t
的值。
编辑:但实际上,如果我正确地阅读了规范文档,它似乎应该返回表达式的值。
正如@T.J.Crowder提到的那样,似乎是var
导致了undefined
的值。但这并不意味着你不应该使用var
。你编写的代码是100%正确的。
这更深入地涉及语言的内部工作,我认为这不是你感兴趣的内容。但是,如果需要更多信息,请查看评论。
var
的问题。感谢您的见解。 - Felix Klingvar
语句返回一个没有值的正常完成,赋值操作的值显然是被赋值表达式的值,例如:var a; alert(a = 'foo'); alert(a);
将会两次弹出'foo'
... 一段时间以前我正在写一篇关于完成类型的文章,但我还没有时间完成它,这里是一个旧的草稿。 - Christian C. Salvadó(normal, empty, empty)
,所以我猜这就是你所说的“正常完成”(在查看你的草稿后我可以确认)。谢谢! - Felix Klingvar t = (1 == 1) ? 1 : 0;
t
就可以查看t
实际上的值。我知道 WebKit 控制台是这样工作的。 - Matt Ball