Javascript中的 “,” 『逗号表达式』

1,229 阅读2分钟

逗号表达式

逗号表达式的一般形式是:

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

举个栗子:

x=8*2,x*4 /*整个表达式的值为64,x的值为16*/ 
(x=8*2,x*4),x*2 /*整个表达式的值为128,x的值为16*/ 
x=(z=5,5*2) /*整个表达式为赋值表达式,它的值为10,z的值为5*/ 
x=z=5,5*2 /*整个表达式为逗号表达式,它的值为10,x和z的值都为5*/ 

逗号运算符的优先级低于一般运算符,所以使用时一般要用小括号将其包起来:

//函数调用运算符将先于逗号运算符运行
alert(2*5, 2*4); // 10
alert((2*5, 2*4)); // 8
const b = (1,2,3);
console.log(b); // 3

遇到过的简洁写法:

const list = [
    { id: 1, name: "部门 A", parentId: 0 },
    { id: 2, name: "部门 B", parentId: 0 },
    { id: 3, name: "部门 C", parentId: 1 },
    { id: 4, name: "部门 D", parentId: 1 },
    { id: 5, name: "部门 E", parentId: 2 },
    { id: 6, name: "部门 F", parentId: 3 },
    { id: 7, name: "部门 G", parentId: 2 },
    { id: 8, name: "部门 H", parentId: 4 },
];
const a = list.reduce((acc, cur) => (acc[cur.id] = cur, acc), {});

现实应用:

babel转译出来的代码中,经常会看到

(0, _xyz.default)(param1, param2)

为什么要这么干?

// 函数调用,函数内部的this为空(严格模式下) 
func(param);
// 方法调用,方法内部的this为obj
obj.method(param);

所以,上述的转译代码,其实是一种相对tricky的方式完成了一个函数调用,相当于:

// 以下代码和(0, _xyz.default)(param1, param2)等价 
const func = _xyz.default;
func(param1, param2)

没明白什么意思?看下面代码:

"use strict";
function f1() {
    console.log(this);
}
const obj1 = {
    f2: function () {
            console.log(this);
    },
};
f1(); // undefined
obj1.f2(); // {f2: ƒ()}
function f3() {
    console.log(this);
}
const obj2 = {
    f4: function () {
            console.log(this);
    },
};
(0, f3)(); // undefined
(0, obj2.f4)(); // undefined