什么奇怪的语法?

12

我在 JQuery 网站上发现了一种我不熟悉的代码结构。经过一些格式化处理后,它看起来像是:

function (a,c) {
    c==null && (c=a,a=null);
    return arguments.length>0
        ? this.bind(b,a,c) 
        : this.trigger(b)
}

这个函数的第一行是什么意思?它是任何技巧还是标准的JS代码结构?


5
这是Java、php、Javascript以及大多数其他编程语言中的标准。 - Tom
如果你要查看jQuery代码,请查看开发版本而不是压缩版本。这里是开发版本的链接:http://code.jquery.com/jquery-1.6.2.js。 - qwertymk
1
@Tom:在 JavaScript 中,逗号运算符与其他 C 风格语言中的不同。 - dolmen
4
哇,那些代码压缩工具真的很激进 - 它只比"if(c==null){c=a;a=null}"短了一个字符。 - Random832
3个回答

15

这是一种使用布尔短路运算的技巧,只有在第一个条件为真时才执行第二个条件。Perl中经常使用此方法:

<something> or die

如果第一条语句失败,程序将会终止。

理解为

if (c == null) { c = a; a = null; }

2
逗号使两个命令无需分号即可执行。 - Digital Plane
2
这反过来又允许两个语句在一行中执行,这比if语句节省了字符。 - zzzzBov
2
@Gunslinger_:实际上快了多少? - Mchl
Python还允许您使用A or B作为类似于A!= null && A == true? A:B的等效方式。虽然在Python中,您可以这样说:A if A != None and A == True else B。也许我错过了Python用法的一些微妙之处。 - JAB
@JAB 这在 JavaScript 中是可能的。 - user216441

12

那是一种丑陋的写法

if(c==null) {
  c = a;
  a = null;
}

这利用了布尔运算符&&的特性:只有当第一个条件为真时,第二个条件才会被执行。


2
非常丑陋,对许多开发人员来说也非常不直观。你能找到写这个的人并踢他吗? - Schroedingers Cat
10
由于变量名为abc,因此这段代码很可能是由代码压缩工具生成的。jQuery目前似乎使用UglifyJS - dolmen
2
丑化?这解释了很多事情,不是吗?;D - Mchl

2
该表达式使用了两个 JavaScript 特性: 因此,该表达式等同于:
if (c == null) {
    c = a
    a = null
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接