1

我正在使用 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

4

2 回答 2

2

这是简写

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

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

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

于 2013-10-15T18:51:21.550 回答
2

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

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

如果左侧评估为值,则结果为左侧,右侧不评估。您可以通过在括号中传入参数列表来进一步扩展它。在这种情况下,如果左边的每个项目都评估为真,则不会评估右侧。如您所见,您可以将任意数量的这些语句链接在一起。

于 2013-10-15T18:55:08.557 回答