由于运算符优先级而导致令人惊讶的值分配?

时间:2013-02-08 10:13:55

标签: javascript jquery

基于完全错误的逻辑的原始问题:O

$(function() {
  var x=0,y=1;
  $("#div_id").find("input:text").each(function (i, input)  {
    $(this).val(""+(i % 2 == 0)?x++:y++);
  });
});  

如果我从值中删除“”+,我会得到错误的结果

enter image description here

而不是我想要的,这就是:

enter image description here

如果我使用prop:

    $(this).prop("value",""+(i % 2 == 0)?x++:y++);

如果我在++

前加上相同的话

我在俯瞰什么?这是显而易见的事吗?


更新:我完全错过了这里的船。

这是我打算写的代码,它没有“”

$(function() {
  var x=0,y=1;
  var inputs = $("#div_id").find("input:text");
  var y = Math.ceil(inputs.size()/2);
  inputs.each(function (i, input)  {
    $(this).prop("value",(i % 2 == 0)?++x:++y);
  });
});  

2 个答案:

答案 0 :(得分:6)

"" + (i % 2 == 0) ? x++ : y++

被解释为(见precedence rules

("" + (i % 2 == 0)) ? x++ : y++

("" + (i % 2 == 0))始终是真实的,因为"true""false"都是非空字符串。因此,在您的示例中,您始终使用x++,忽略y++分支。

答案 1 :(得分:1)

似乎associativity的+运算符是从表达式的左到右。如果仅删除""+ (i % 2 == 0),则条件运算符的条件将被评估为true为false。但是如果你包括它将不会被评估为布尔而不是字符串,并且总是为真。

使用字符串,你将永远是真的

alert("" + false ? "true" : "false");

<强> Live Demo