2013-10-15 16 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值,結果是左側和右側不評估。您可以通過在括號中傳遞參數列表來進一步擴展它。在這種情況下,如果左邊的每個項目評估爲真,右邊將不會被評估。正如你所看到的,你可以將盡可能多的這些陳述鏈接在一起,只要你喜歡。