2013-10-15 17 views
1

我正在做一些与D3.js的工作,并且正在调整一个内置映射投影的版本。我期待通过源代码,并发现低于其采用了语法,我不熟悉的功能定义:奇怪的JavaScript语法,看起来像一个Python元组

function albersUsa(coordinates) { 
    var x = coordinates[0], y = coordinates[1]; 
    point = null; 
    (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y); 
    return point; 
} 

具体如何被(lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);评估?

如果您需要更多的背景下,这种例子发生在D3源,它可以在这里找到的3257行:https://github.com/mbostock/d3/blob/master/d3.js

回答

2

这是速记

lower48point(x, y); 
if (!point) { 
    alaskaPoint(x, y); 
    if (!point) { 
    hawaiiPoint(x, y); 
    } 
} 

三个功能必须改变的值相对全球变量“点”。 ||版本使用逗号运算符来执行两个表达式并利用副作用。

个人而言,我不会为自己编写代码感觉良好。

+0

特别注意''''在函数调用里面设置,不返回。 –

+0

这是不正确的。每个if语句不仅要评估点,还要评估“lower48point”的结果。 – Langdon

+0

@LarsKotthoff是的,虽然看着那个代码我不知道它是如何发生的。这段代码让我更害怕d3。 – Pointy

2

||在JavaScript中是后备操作符。一个简单的例子是:

var a = true || 1; // evaluates to true 
var a = false || 1; // evaluates to 1 
var a = 'x' || 1; // evaluates to true 

如果左侧的计算结果为truthy值,结果是左侧和右侧不评估。您可以通过在括号中传递参数列表来进一步扩展它。在这种情况下,如果左边的每个项目评估为真,右边将不会被评估。正如你所看到的,你可以将尽可能多的这些陈述链接在一起,只要你喜欢。