首先看个例子
var i,j,k;
for( i = 0 , j = 0; i < 10 , j < 6; i++ , j++ ) {
k = i+j;
console.log('i='+i+',j='+j+',k的结果是:'+k);
}
控制台结果是:
对上面的例子做一下修改
var i,j,k;
for( i = 0 , j = 0; i < 2 , j < 5; i++ , j++ ) {
k = i+j;
console.log('i='+i+',j='+j+',k的结果是:'+k);
}
控制台结果如下:
是不是有些疑惑?主要是因为逗号运算符。
逗号运算符
作用:将若干表达式连接起来。
特点:优先级别在所有运算符中是最低的,结合方向是"自左至右"的
逗号表达式
一般形式:表达式1,表达式2,表达式3……表达式n
求解过程:先计算表达式1的值,再计算表达式2的值,……一直计算到表达式n的值。最后整个逗号表达式的值是表达式n的值。
举个例子
x = 8*2, x*4 // 整个表达式的值为64, x的值为16
现在你应该明白上面的前两个例子的执行结果了吧。i<10, j<6; 只要满足 j<6 就继续for循环,否则退出循环。i<2, j<5; 只要满足 j<5 (即使可能不满足i<2)就继续for循环,否则退出循环。
再来看逗号运算符与函数运算符相冲突的例子
alert(2,5); //2
alert((2,5)); //5
由于逗号运算符在 JavaScript 运算符的优先级是最低的,函数运算符先于逗号运算符运行,因此第一个alert函数弹出2。第二个alert函数,加上括号后保证了逗号运算符先运行,因此弹出5。
逗号运算符和赋值运算符冲突
var a = 20;
var b = ++a, 10; // 报错
console.log(b);
上述代码会报错
由于逗号运算符要求它的运算数为复杂表达式或简单表达式(如变量或直接量),赋值运算符先于逗号运算符执行,使逗号运算符左边不是一个运算数或表达式,而是含有var关键字的语句,因此报错。
解决方法:只需加上括号,即 var b = (++a, 10),保证逗号运算符先执行即可。
再看几个示例:
console.log((0, 9)); //9
console.log((9, 0)); //0
if ((9, 0)) console.log("no"); // 没有打印
if ((0, 9)) console.log("yes"); //yes
交换变量,无需第三个变量
var a = 'a', b = 'b';
//method1
a = [b,b=a][0];
//method2
a = [b][b=a,0];
简化代码,但是可读性差
if(x) {
foo();
return bar();
} else {
return 1;
}
// equal to
return x ? (foo(), bar()) : 1;