我的一个项目中有一个函数可以进行一些矢量计算。最近我开始注意到结果的不一致性,当我去挖掘时,我发现在某些地方,JavaScript会执行连接而不是添加。在搜索时,我发现你可以通过添加parsefloat()
来阻止它,以确保变量是浮点数。所以现在我有了这个:
function getsqSegDistID(p, p1, p2) {
var x = parseFloat(p1.x),
y = parseFloat(p1.y),
dx = p2.x - x,
dy = p2.y - y;
if (dx !== 0 || dy !== 0) {
var t = (parseFloat((p.x - x) * dx) + parseFloat((p.y - y) * dy)) / (parseFloat(dx * dx) + parseFloat(dy * dy));
if (t > 1) {
x = p2.x;
y = p2.y;
} else if (t > 0) {
x = parseFloat(x) + parseFloat(dx * t);
y = parseFloat(y) + parseFloat(dy * t);
}
}
dx = p.x - x;
dy = p.y - y;
return parseFloat(dx*dx) + parseFloat(dy*dy);
}
查看我放入的所有parseFloat
所以我的问题是在每次添加之前添加一个parsefloat会显着降低该函数的性能。现在执行的时间比以前多5倍。
1。我必须在每次添加前添加一个parseFloat吗?还是有更好的方法?
2。我是一名C / Java开发人员,但我正在帮朋友写一些处理逻辑。那么为什么heck 没有JavaScript有某种形式的数据类型强制执行?
答案 0 :(得分:2)
如果一个或多个操作数是字符串,JavaScript将尝试连接。您当然不需要每次都调用p1.x
,只需确保在所有传递的变量上调用它。我看到您最初解析p1.y
和p
,但不对p2
或private void btnCall_Click(object sender, EventArgs e)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost/RESTWS/v1/call");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "request={\"target\":\"bridge\",\"operation\":\"makeCall\",\"params\":[\"" + Number + "\",3000000000000000012,true,0,null]}";
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
this.Close();
}
中的值执行相同操作。
JavaScript是一种解释型语言,因此是动态类型的。必须编译静态类型的语言;这只是语言设计中众多权衡之一。