引子
逗号在javascript中很常见,那么这个有什么好说的呢?
先来看两个例子吧:
1 2 3 4 5 6
| var num = (1, 2, 3); console.log(num); // 3 function foo(){ alert(1, 2, 3); }; foo(); // 1
|
这中间到底发生了什么呢,先来安利一下概念,然后再来分析好吧^_^
逗号-按用途分类
在javascript中,根据逗号
使用的主要形式我们姑且可以分做两类:
1、作为普通分隔符使用
2、作为操作符(运算符)使用
作为分隔符
直接上例子吧
1 2 3 4 5 6 7 8
| //1-1 var a, b, c; //1-2 var arr = [0, 1, 2, 3]; //1-3 function bar(arg1, arg2, arg3, arg4){ //balabala... }
|
这些都是很直接的用于分隔作用的:变量与变量之间、数组元素与元素之间、函数的参数与参数之间。
所以上面的foo()
中,由于alert()
只接受一个参数,所以默认第一个参数,故返回1。
作为操作符(运算符)
逗号操作符 对它的每个操作对象求值(从左至右),然后返回最后一个操作对象的值
作为操作符时通常用于表达式中。当你想要在期望一个表达式的位置包含多个表达式时,可以使用逗号操作符
。
上面(1, 2, 3)
就是一个表达式,故从左至右,返回最后一个操作对象的值,故num = 3
示例与应用
为了能够更好的理解这两种分类,我们再来多看一些示例。
1 2 3 4
| //2-1 for(var i=0,j=0,len=10;i<len;i++,j++){ //balabala... }
|
这里前面var
语句中的逗号
就起了分隔作用,讲不同的变量声明结合起来;
而后面的i++,j++
语句中的逗号
则是作为操作符,表达式从左至右依次计算。
那么,我们将上面foo()
修改为
1 2 3 4 5
| //2-2 function foo(){ alert((1, 2, 3)); }; foo(); // 3
|
此时,我们来分析下:
首先因为()
,所以会先计算(1, 2, 3)
,而这是一个表达式,根据其概念会返回最右边的操作数,故最终结果为alert(3)
;
当然,也会一些下面的情况,我们可以看看:
1 2 3 4
| //2-3 var a = 1,2,3; //error: Uncaught SyntaxError: Unexpected number var b = 1,''; //error: Uncaught SyntaxError: Unexpected string var c = 1,'字符串'; //error: Uncaught SyntaxError: Unexpected string
|
这种情况浏览器会报错,逗号后面的字符串或数字没有声明;
那么如果我们修改一下呢?
1 2 3 4 5
| //2-4 var a = (1,2,3); //3 var b = (1,''); //'' var c = (1,'字符串'); //字符串 var d = (1,); //error: Uncaught SyntaxError: Unexpected token )
|
结果是显而易见的。注意最后一种情况,这里没有第二个操作数,会报语法错误;
当然这里第二个(或者最右边的)操作对象为undefined
、null
、{}
、''
都可以正常解析,不写则会报错。
我们再把2-1
做一下修改:
1 2 3 4
| //2-5 var a = 1,aa,bb,cc; //正常不会报错 a=1 var a = 1,aa,2,cc; //error: Uncaught SyntaxError: Unexpected number var a = 1,aa,'',cc; //error: Uncaught SyntaxError: Unexpected string
|
这里,你会发现,作为分隔符作变量声明时,逗号
后面的操作对象得是可以作为变量名的对象,否则会报错;而用作操作符时则无需担心这个。
说了这么多,我们来看看下面这个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| //2-6 function zoo(){ return 1,2,3; //3 } var i=0,j=1; function(){ return ++i, j++; //1 } var m = 1, n = 2; function(){ return ++m, m+n; //4 }
|
so,就这样了,如有不对或错误之处,欢迎交流!
Github
博客原文