我通常在可选参数解析时使用它。我认为这使得函数体更易读和更简洁,因此参数解析不会占据函数主体。
/**
* @param {string} [str]
* @param {object} [obj]
* @param {Date} [date]
*/
function f(str, obj, date) {
// handle optional arguments
if (typeof str !== "string") date = obj, obj = str, str = "default";
if (obj instanceof Date) date = obj, obj = {};
if (!(date instanceof Date)) date = new Date();
// ...
}
Let's say you have an array:
arr = [];
push
元素时,你很少关心push
的返回值——即数组的新长度,而是更关心数组本身。这时候你需要使用原始回答
。arr.push('foo') // ['foo'] seems more interesting than 1
(arr.push('bar'), arr.push('baz'), arr).sort(); // [ 'bar', 'baz', 'foo' ]
逗号运算符(,)按从左到右的顺序评估其每个操作数并返回最后一个操作数的值。这使您可以创建一个复合表达式,其中多个表达式被评估,复合表达式的最终值是其成员表达式中最右边的值。这通常用于为for循环提供多个参数。
let x = 1;
x = (x ++,x);
console.log(x); // 预期输出:2
x = (2, 3);
console.log(x); // 预期输出:3
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
它可以避免您在嵌套条件语句中使用return
,尤其是在三元运算符中非常方便。例如:
function insert(v){
return this.node > v ? this.left.size < this.right.size ? ( this.left.insert(v)
, this
)
: ( this.left.insert(this.node)
, this.node = this.right.popmin()
, this.insert(v)
, this
)
: this.left.size < this.right.size ? ( this.right.insert(this.node)
, this.node = this.left.popmax()
, this.insert(v)
, this
)
: ( this.right.insert(v)
, this
)
}
逗号运算符可以用于代码混淆的另一个领域。
假设一个开发者编写了以下代码:
var foo = 'bar';
现在,她决定混淆代码。使用的工具可能会将代码更改为以下内容:
var Z0b=(45,87)>(195,3)?'bar':(54,65)>(1,0)?'':'baz';// Z0b == 'bar'
var i, j, k;
和var i; var j, var k
有什么区别? - Salman A,
运算符有任何关系。那行代码在C#中也是有效的,但是在C#中不存在,
运算符。 - gdoron,
)不总是逗号操作符,而且它从不是逗号操作符。因此,即使没有逗号操作符,C#仍然可以自由地使用逗号作为语法的一部分。请注意,这里不需要写解释。 - Seth Carnegiea
和b
的值,你可以这样写:a = [b][b = a,0]
。这会把当前的b
放到数组中。第二个“[]”是属性访问符号。被访问的索引是0
,但是在将a
分配给b
之前,这不会发生,因为现在b
被保留在数组中。逗号运算符让我们在“[]”中执行多个表达式。 - user1106925