我正在从Adobe(snap.svg.js)的库中读取代码,然后看到了这段代码,这让我感到困惑:
function curveDim(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),
b = 2 * (c1x - p1x) - 2 * (c2x - c1x),
c = p1x - c1x,
t1 = (-b + Math.sqrt(b * b - 4 * a * c)) / 2 / a,
t2 = (-b - Math.sqrt(b * b - 4 * a * c)) / 2 / a;
Math.abs(t1) > "1e12" && (t1 = .5);
Math.abs(t2) > "1e12" && (t2 = .5);
由于公式非常复杂,我无法提供值来对其进行测试,所以我想问一个普遍的问题:为什么可以将Math.abs(t1)与字符串“ 1e12”进行比较?难道不可以将浮点数转换为字符串然后进行词法比较吗?如果变量a为零怎么办?这是好的代码吗?关于作者正在尝试做什么以及它是否正确的任何解释都是很好的。
最佳答案
不,>
运算符将两个操作数都转换为数字(http://es5.github.io/#x11.8.2,http://es5.github.io/#x11.8.5)。
查看将字符串转换为数字时会发生什么:
> +"1e12"
1000000000000
1e12
is actually a valid number literal表示1 *1012。不知道为什么使用字符串代替,Math.abs(t1) > 1e12
也可以正常工作。