以下哪个表达式总是在所有浏览器中从左到右排列(特别是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;
答案 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)”中,说“乘法首先完成”是误导性的。说“乘法优先于加法”是正确的。
操作是:
前三个可以按任意顺序完成,或者 - 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)));