3

我真的不知道该怎么称呼这个问题,也不知道我可以用谷歌搜索什么。我试图理解 D3.js 库的源代码,但由于语法对我来说是新的,我遇到了两个我根本无法理解的函数。

第一个是数字插值器:

function d3_interpolateNumber(a, b) {
  b -= a = +a;
  return function(t) { return a + b * t; };
}

这里的第二行发生了什么?我们从 的值中减去 的值ba然后……嗯,你失去了我。这个语法是如何工作的?

让我感到困惑的另一件事是,我在其他地方也看到过,变量的右侧赋值由几个用逗号分隔的变量组成。如:

var i = d3.interpolators.length, f;

这是什么意思?这些片段取自https://github.com/mbostock/d3/blob/master/src/interpolate/number.jshttps://github.com/mbostock/d3/blob/master/src/interpolate/interpolate .js

4

3 回答 3

18

您要询问的第一行只是两个作业。这相当于:

a = +a;
b -= a;

+a是使用一元加号运算符将字符串转换为数字。因此,我们将转换a为一个数字,然后从该数字中减去该数字b(并将新值重新分配给b)。

您要询问的第二点语法只是变量声明的列表。例如:

var a, b, c; // Declares 3 variables, all initialised to undefined

这相当于:

var a;
var b;
var c;

在您的示例中,列表中的声明之一还包括一个赋值。它们中的任何数量都可以,所以这也是有效的:

var a, b = 1, c = true, d;
于 2013-04-08T14:38:03.643 回答
0

第二行是

 b -= (a = +a);

意思是:

  • 设置a+a(转换为数字)。在括号外返回此值。
  • 无论返回什么值,从 b 中减去它。

或者

a=+a //converts a to an int
b-=a // or b=b-a

请记住,赋值返回它们的值。所以,alert(a=1)会提醒1


另一方面,

var i = d3.interpolators.length, f;

拆分为:

var i = d3.interpolators.length;
var f;

这基本上是一种说法“var 适用于以下逗号分隔列表”

于 2013-04-08T14:41:17.820 回答
0

赋值也是一个表达式,它返回被赋值的值。所以这:

b -= a = +a;

是相同的:

b -= (a = +a);

或者:

a = +a;
b -= a;

如果右侧真的是用逗号分隔的值,即:

var i = (d3.interpolators.length, f);

然后逗号运算符返回最后一个操作数的值,因此它与以下内容相同:

d3.interpolators.length;
var i = f;

但是,如果没有括号,逗号是声明变量之间的分隔符,而不是逗号运算符,因此它与以下内容相同:

var i = d3.interpolators.length;
var f;
于 2013-04-08T14:42:01.713 回答