运营商的Javascript评估顺序

时间:2011-05-10 02:44:00

标签: javascript evaluation

以下哪个表达式总是在所有浏览器中从左到右排列(特别是IE6 +,F3 +,Opera 9 +,Chrome)?例如,窗口应始终提醒first function然后second function。在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();

使用mozilla似乎功能评估应该在所有浏览器中保持一致,但显然并不总是遵循标准。

测试

在browsershots.org上进行一些测试后,所有浏览器都会遵循标准 通常 例外情况是依赖于javascript中的valueOf方法。在特定情况下,谷歌浏览器肯定会向后调用ValueOf

// The following alerts second then first in google chrome
first.valueOf = function(){alert('first');};
second.valueOf = function(){alert('second');};
first > second;

4 个答案:

答案 0 :(得分:7)

ECMAScript 5指定所有运算符的操作数的评估顺序。对于代码中的每个操作符,剪辑的评估顺序是从左到右。我不确定是否有人可以回答所有浏览器的行为。

修改:另请参阅ECMAScript 3.评估顺序的定义方式相同。

答案 1 :(得分:4)

将表达式评估为值(例如涉及函数调用)始终从左到右进行。

但是,一旦比较了两个值,它们就不会转换为基元,以便以从左到右的方式进行实际比较。请在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"

答案 2 :(得分:2)

运营商优先级和评估顺序是两个完全不同的东西。在表达式“sqrt(9)+ sqrt(16)* sqrt(25)”中,说“乘法首先完成”是误导性的。说“乘法优先于加法”是正确的。

操作是:

  1. SQRT(9)
  2. SQRT(16)
  3. SQRT(25)
  4. 4 * 5
  5. 3 + 20
  6. 前三个可以按任意顺序完成,或者 - gasp - 同时如果你有一个四核CPU和一个可以利用它的浏览器。 1必须在5之前完成,2和3必须在4之前完成,4必须在5之前完成。没有其他保证。

    在表达式“a&amp;&amp;(b / a)”中,JavaScript保证首先评估a,如果a为零,则不评估b / a。许多其他语言(包括Fortran)不保证这一点,并且可以获得除零的异常。

答案 3 :(得分:0)

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

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)));