Javascript有趣的逗号运算符

5,866 阅读4分钟

聊一聊Javascript有趣的逗号操作符

前提: 表达式 语句 运算符

    1. 表达式  可以表示值的任何代码都是表达式。由于表达式产生值,因此它们可以出现在JavaScript期望值的程序中的任何位置
10 // 数字表达式
'有趣的逗号' // 字符串表达式
1&&2;
true || false; //逻辑表达式
a = 1 // 赋值表达式
    1. 语句 语句是执行特定操作的指令。这样的动作包括创建变量或函数,遍历元素数组,基于特定条件评估代码等。JavaScript程序实际上是一系列语句。
var a; // 变量声明语句
function foo() {} // 函数声明语句
var = b =(a = 1 ) //语句表达式
但是没有表达式语句
    1. 运算符
+ - * % / 算术运算符
&& || ^ 逻辑运算符
> < = != 比较运算符
a ? true : false 三元运算符
, 逗号运算符

上面的两点中可以看出 语句中可以有表达式  但是表达式中不能包含语句等其他关键保留字

语句 表达式 运算符的关系
var a = 3; // 语句中含有赋值运算符和数字表达式
var b = 5;
var c = a + b * 3&emsp;> 14 ? 2 : 11;&emsp;//&emsp;语句中有算术运算符&emsp;比较运算符&emsp;三元运算符 还有赋值语句&emsp;还有var变量声明语句

逗号运算符

MDN的解释(developer.mozilla.org/zh-CN/docs/…)

逗号操作符 对它的每个操作数求值(从左到右),并返回最后一个操作数的值。

简单的赋值运算
var a;
a = (1, 2, 3, 4*2+1);
console.log(a) // 9
// 从左往右计算返回的是4*2+1

上面的例子没有很好的解释从左往右依次执行,再来一个例子

检测是否从左至右依次执行
var a = 10, b = 12, c = 15;
var d;
function test() {
  return a++, b+=2, c+=3 , 100
}
d = test();
console.log(a, b, c, d);
// 11 14 18 100

这里说明在return 后的逗号表达式都依次执行了相应的运算

带括号的逗号运算符
alert(2, 3) // 永远只会弹出2

因为逗号运算符在Javascript中的优先级最低 所以优先级高的函数执行会覆盖优先级低的逗号运算符, 如何提升优先级?

加括号
var a = 10; 
var b = 12;
var c = 15;
var d;
d = a, b++, c++, 100;
console.log(a, b, c, d); // 10 13 16 10
var a = 10; 
var b = 12;
var c = 15;
var d;
d = (a, b++, c++, 100);
console.log(a, b, c, d); // 10 13 16 100

解析:

  • 第一个不带括号d一直等于a的值 因为赋值运算优先级大于逗号运算
  • 第二个加了括号是逗号的优先级得到提升 先运算逗号运算符的结果赋值给a 所以a为100
不能运行的情况

上面的代码都是先声明的变量后进行的逗号运算 这次来一点不一样的

var a = 20;
var b = a, 2;
// Uncaught SyntaxError: Unexpected number

解析:

  • var b = a, 2使(var b = a)这部分作为了表达式 表达式中不能含有语句所以报错--- 这里的说法可能不准确 我自己的理解
  • 把后面的a, 2用括号隔离起来就可以了
var a = 20;
var b = (a, 2);
console.log(b); // 2

逗号操作符的作用

    1. 一次操作计算多个项
下面是一个大厂的面试题
var i = j = 0, k = 0;
for(i, j; i < 10, j < 6; i++, j++) {
   k = i + j;
}
console.log(k); // 10

解析:

  • i,j,k的初始值都是0
  • for循环中有三处逗号操作 i,j i < 10, j < 6 i++, j++
  • 每个逗号操作符都会从左至右一次执行并返回最后的操作项的值
  • 每次循环i++ j++
  • 但是在判断循环的终止条件用的是j < 6来进行判断
  • i,j都是5的时候 k = 10
  • i,j都是6的时候 6 !< 6循环终止 k等于10
参考文档

medium.com/launch-scho…
2ality.com/2012/09/exp…
www.lib.ru/JAVA/javasc…

我的公众号