运算符的Javascript求值顺序

运算符的Javascript求值顺序,javascript,evaluation,Javascript,Evaluation,在所有浏览器(尤其是IE6+、F3+、Opera 9+、Chrome)中,以下哪一个表达式始终位于从左到右的前面?例如,窗口应始终警告第一个功能,然后警告第二个功能。在C语言中,他们总是建议不要依赖于表达式求值的顺序。JavaScript也是如此,还是运算符优先级一致 function first(){ alert('first function'); return 0; } function second(){ alert('second function');

在所有浏览器(尤其是IE6+、F3+、Opera 9+、Chrome)中,以下哪一个表达式始终位于从左到右的前面?例如,窗口应始终警告第一个功能,然后警告第二个功能。在C语言中,他们总是建议不要依赖于表达式求值的顺序。JavaScript也是如此,还是运算符优先级一致

function first(){
    alert('first function');
    return 0;
}
function second(){
    alert('second function');
    return 23;
}
first() + second();
first() - second();
first() * second();
first() / second();
first() < second();
first() > second();

将表达式求值为值(例如,涉及函数调用)始终是从左到右进行的

但是,一旦比较两个值,它们就不会转换为基本体,以便以从左到右的方式进行实际比较。例如,在Chrome中尝试以下操作:

var l = {valueOf: function() { alert("L"); }};
var r = {valueOf: function() { alert("R"); }};

l < r; //alerts "L", then "R"
l > r; //alerts "R", then "L"
var l={valueOf:function(){alert(“l”);};
var r={valueOf:function(){alert(“r”);};
lr//警报“R”,然后是“L”

我不确定您的用例是什么,但这可能是一个选项:

function add() {
  var retval = 0;
  for (var i = 0; i < arguments.length; i++) {
    retval += arguments[i];
  }
  return retval;
}

function echoNum(num) {
  alert("Num: " + num);
  return num;
}

alert("Result: " + add(echoNum(1), echoNum(2)));
函数添加(){
var-retval=0;
for(var i=0;i
指定所有运算符的操作数求值顺序。对于代码snip中的每个运算符,求值顺序是从左到右。我不确定是否有人能回答所有浏览器的行为


编辑:另请参见,求值顺序的定义方式相同。

运算符优先级和求值顺序是两个完全不同的东西。在表达式“sqrt(9)+sqrt(16)*sqrt(25)”中,说“乘法先完成”是错误的。说“乘法优先于加法”是正确的

行动包括:

  • sqrt(9)
  • sqrt(16)
  • sqrt(25)
  • 4*5
  • 3+20
  • 前三个可以按任意顺序完成,或者——喘息——如果您有一个四核CPU和一个可以利用它的浏览器,那么可以同时完成。1必须在5之前完成,2和3必须在4之前完成,4必须在5之前完成。没有其他保证


    在表达式“a&&(b/a)”中,JavaScript保证首先计算a,如果a为零,则不计算b/a。包括Fortran在内的许多其他语言都不能保证这一点,并且可以得到零除法异常。

    我目前没有特定的用例,我只是想澄清事实上的标准。不过这个想法很酷。那么运营商们都同意什么样的优先级呢?@Claudiu-刚刚在Chrome&FF中测试过,并不是这样的。它总是从左到右我特别好奇上面列出的前五个操作符
    +-*/@Lime:应该总是从左到右。关于C的警告(至少)是因为函数调用通常是从右到左进行的,因此如果您将类似于
    i++
    的操作作为参数之一,则预期其副作用(如
    f(i++,i))
    ,您可能会感到惊讶。感谢您的澄清。我正要问有关订单的问题时,您覆盖了valueOf方法。我领先了一步。:)像上面那样覆盖valueOf方法是可以接受的,还是不好的做法和混乱?我一直想创建一个
    time
    对象,其值为返回当前时间,这样我就可以去掉括号和类似的技巧。我特别好奇上面列出的前五个操作符
    +-*/
    +-*/
    还应该从左到右计算它的操作数,任何行为不同的现代javascript引擎都有一个bug。抱歉,我不知道每个浏览器中每个javascript引擎的bug,所以无法完全回答这个问题。@Jake:这不是bug,它在ECMAScript第三版规范中。不过我更新了我的答案,因为它比我记忆中的更微妙。@Claudiu:不,这是一个错误。ECMAScript第三版规范中的
    操作符明确指定了从左到右的操作符求值。如果您不想相信我的话,请参考我链接的规范。@Jake:仔细阅读。对于
    a>b
    ,首先计算
    a
    ,得到
    val\u a
    ,然后计算
    b
    ,得到
    val\u b
    (11.8.2)。从左到右。然后,
    val_b$我理解C可以像您上面描述的那样工作,但是我真的不相信javascript的函数在任何情况下都是同时出现的。我有四个i5处理器,在firefox、chrome或opera中绝对不会出现这种情况。Javasrcript无论如何都是单线程的。在javascript中,一次只能执行一个函数。从上面的资料来看,似乎有一个标准,浏览器是否遵循这个标准。
    
    function add() {
      var retval = 0;
      for (var i = 0; i < arguments.length; i++) {
        retval += arguments[i];
      }
      return retval;
    }
    
    function echoNum(num) {
      alert("Num: " + num);
      return num;
    }
    
    alert("Result: " + add(echoNum(1), echoNum(2)));