我真的不知道该怎么称呼这个问题,也不知道我可以用什么来谷歌。我正在尝试理解D3.js库的源代码,并且我遇到了两个我根本无法理解的函数,因为我的语法是新的。
第一个是数字插值器:
function d3_interpolateNumber(a, b) {
b -= a = +a;
return function(t) { return a + b * t; };
}
第二行发生了什么?我们从b
的值中减去a
的值,然后......呃,你失去了我。这种语法有用吗?
让我感到困惑的另一件事,就是我在其他地方也看到的,是变量的右手赋值由几个用逗号分隔的变量组成的。如:
var i = d3.interpolators.length, f;
这是什么意思?这些片段取自https://github.com/mbostock/d3/blob/master/src/interpolate/number.js和。{ https://github.com/mbostock/d3/blob/master/src/interpolate/interpolate.js
答案 0 :(得分:17)
你要问的第一行只是两个作业。它等同于:
a = +a;
b -= a;
+a
正在使用unary plus operator将字符串转换为数字。我们正在将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;
答案 1 :(得分:0)
第二行是
b -= (a = +a);
这意味着:
a
设置为+a
(转换为数字)。将此值返回括号外。或
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 applie to以下逗号分隔列表”
答案 2 :(得分: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;