看起来像Python元组的奇怪的JavaScript语法

时间:2013-10-15 18:48:33

标签: javascript syntax d3.js

我正在与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

2 个答案:

答案 0 :(得分:2)

这是

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

这三个函数必须改变相对全局变量“point”的值。 ||版本使用逗号运算符执行两个表达式并利用副作用。

就我自己编写代码而言,我个人感觉不太好。

答案 1 :(得分:2)

JavaScript中的

||是后备运算符。一个简单的例子是:

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

如果左侧评估为 truthy 值,则结果为左侧,而右侧未评估。您可以通过在括号中传入参数列表来进一步扩展它。在这种情况下,如果左侧的每个项目评估为真实,则不会评估右侧。正如您所看到的,您可以根据需要将这些语句链接在一起。