JS中逗号运算符的用法

逗号运算符,它将先计算左边的参数,再计算右边的参数值。然后返回最右边参数的值。

原书举的例子不太好,无法解释上面那句话,这里另外提供一个:

var a = 10, b = 20;
 
function CommaTest(){
    return a++, b++, 10;
}
 
var c = CommaTest();
 
alert(a); // 返回11
alert(b); // 返回21
alert(c); // 返回10

变量c的值是函数CommaTest返回的值,而a和b多加1了。

逗号运算符和函数调用运算符的冲突

在JavaScript中,函数调用确实是函数调用运算符。它很特殊,因为其它编程语言资料中多从来没有这个叫法的。然后,(才是)它没有固定数目的运算数。

函数调用运算符的第一个参数是一个函数名或者是一个引用函数的表达式,其后是括号()。括号中间可以是数目不定的运算符,这些运算数可以是任意的表达式,它们之间用逗号隔开。

函数调用运算符将计算它的每一个运算数,第一个运算数指定为函数名(括号前),而括号中间的所有运算数的值将传递给这个函数作为函数的参数。

例如(函数调用方式):

document.close()
Math.sin(x)
alert("Welcome " + name)
Date.UTC(2000, 11, 31, 23, 59, 59)
funcs.f(funcs.args[0], funcs.args[1])

知道了调用函数运算符后,我们举个例子说明关于如何处理它们冲突的事。

alert(2*5, 2*4); // 输出10

上面这段代码输出10,但是如果根据逗号运算符的原理来解释的话,那应该是输出8才对。为什么呢?

因为逗号运算符在JavaScript在的优先级是最底的,记住这一点非常有用。所以函数调用运算符将先于逗号运算符运行。结果alert函数输出第一个参数的值。将上面的代码修改成如下所示即可。

alert((2*5, 2*4)); // 返回8

 

逗号运算符和赋值运算赋的冲突

在JavaScript中,逗号运算符的优先级比赋值运算符还要底。请看下面的代码

var a = 20;
var b = ++a,10;
alert(b);

 

这段代码似乎不能运行,可能是由于赋值运算符优先于逗号表达式运行,如果将代码改成

var a = 20;
var b = (++a,10);
alert(b);

即可了。 

 

上面说到的“可能”我们这里做一下解释,这是本人的一些看法,不一定权威。

逗号运算符要求它的运算数是一个复杂的表达式或简单的表达式(如变量或直接量),但由于赋值运算符优先于逗号运算符执行,因此变成左边不是一个运算数或一个表达式,而是一个含有var关键字的语句

之前不能执行的代码可以看成如下代码:

var a = 20;
(var b = ++a),10;
alert(b);

语句中有表达式语句,但不是所有的语句都是表达式。

#################################################

一、逗号运算符的特性及作用

逗号运算符的作用是将若干表达式连接起来。它的优先级别在所有运算符中是最低的,结合方向是"自左至右"的。

如:3*3,4*4

二、逗号表达式

逗号表达式的一般形式是:表达式1,表达式2,表达式3……表达式n

逗号表达式的求解过程是:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。

看下面几个例子:

//示例1
x1=8*2,x1*4    //x1的值为16, 整个逗号表达式的值为 64
console.log(x1); //16
      //      x1=16   64  
console.log( (x1=8*2,x1*4) ); //64

//示例2
(x2=8*2,x2*4),x2*2   //x2的值为 16, 整个逗号表达式的值为 32
console.log(x2)    //16
//              x2=16  64   32
console.log( ( (x2=8*2,x2*4),x2*2 ) )  //32

//示例3
x3=(z3=5,5*2) //x3的值为整个逗号表达式的值, z3的值为5
console.log(x3);  //10
console.log(z3);  //5

//示例4
x4=z4=5,5*2  //整个表达式为逗号表达式,它的值为10,x4和z4的值都为5
console.log(x4, z4);  //5 5
console.log( (x4=z4=5,5*2) )  // 10

 

逗号表达式用的地方不太多,一般情况是在给循环变量赋初值时才用得到。所以程序中并不是所有的逗号都要看成逗号运算符,尤其是在函数调用时,各个参数是用逗号隔开的,这时逗号就不是逗号运算符。

 

运算符使它两边的表达式以从左到右的顺序被执行,并获得右边表达式的值。, 运算符最普通的用途是在 for 循环的递增表达式中使用。例如:

var i, k; //同时声明多个变量的方式(不看成逗号运算符)
var j =0;
for( i=0; i<10; i++, j++){ //每次循环结束时都执行 i++和j++  (逗号运算符)
  k = i + j;
  console.log(k); //总共输出 0,2,4,......16, 18
}

 

每次通过循环的末端时, for 语句只允许单个表达式被执行。, 运算符被用来允许多个表达式被当作单个表达式,从而规避该限制。