我正在与D3.js合作,我正在调整其中一个内置映射投影的版本。我正在查看源代码并找到下面的函数定义,它使用了我不熟悉的语法:
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
答案 0 :(得分:2)
这是
的简写lower48point(x, y);
if (!point) {
alaskaPoint(x, y);
if (!point) {
hawaiiPoint(x, y);
}
}
这三个函数必须改变相对全局变量“point”的值。 ||
版本使用逗号运算符执行两个表达式并利用副作用。
就我自己编写代码而言,我个人感觉不太好。
答案 1 :(得分:2)
||
是后备运算符。一个简单的例子是:
var a = true || 1; // evaluates to true
var a = false || 1; // evaluates to 1
var a = 'x' || 1; // evaluates to true
如果左侧评估为 truthy 值,则结果为左侧,而右侧未评估。您可以通过在括号中传入参数列表来进一步扩展它。在这种情况下,如果左侧的每个项目评估为真实,则不会评估右侧。正如您所看到的,您可以根据需要将这些语句链接在一起。