为什么我在这个javaScript代码中使用NaN

Why I got NaN in this javaScript code?

本文关键字:NaN 代码 javaScript 为什么      更新时间:2023-09-26

首先我测试每个变量都得到一个数值:

09-11 18:15:00.420:
       d_drop: -1.178791867393647
  drop_at_zero: 0.0731037475605623
   sightHeight: 4.5
    d_distance: 40
     zeroRange: 10
09-11 18:15:00.420:
       d_drop: true
  drop_at_zero: true
   sightHeight: true
    d_distance: true
     zeroRange: true
function isNumber (o) {
  return ! isNaN (o-0) && o != null;
}
 var d_drop; // in calculation this gets value 1.1789
 var d_path = -d_drop - sightHeight + (drop_at_zero + sightHeight) * d_distance / zeroRange;
console.log("Path: " + d_path + " cm");

并且在日志中:

09-11 18:15:00.430: D/CordovaLog(1533): Path: NaN cm

为什么?我试着想了几个小时,但没有成功,也许有人有主意,我没有!

谢谢!萨米

-------答案是在使用+操作数时解析每个变量----------------

var d_path=parseFloat(-d_drop)-parseFloat;

如果任意一个操作数是字符串,则加法运算符+将把事物强制转换为字符串。在使用它们之前,您需要将所有输入(d_dropsightHeight等)解析为数字。

以下是+过载工作原理的演示。请注意减法运算符-是如何不重载并始终将操作数强制转换为数字的:

var numberA = 1;
var numberB = 2;
var stringA = '3';
var stringB = '4';
numberA + numberB // 3 (number)
numberA - numberB // -1 (number)
stringA + stringB // "34" (string)
stringA - stringB // -1 (number)
numberA + stringB // "14" (string)
numberA - stringB // -3 (number)

http://jsfiddle.net/jbabey/abwhd/

至少有一个数字是字符串。sightHeight是最有可能的罪魁祸首,因为它会与drop_at_zero连接,产生一个有两个小数点的"数字"——这样的"数字"不是数字,因此NaN

解决方案:使用parseFloat(varname)转换为数字。

如果使用-d_drop作为变量名,这可能是罪魁祸首。变量必须以字母开头。

var     d_drop = -1.178791867393647,
  drop_at_zero = 0.0731037475605623,
   sightHeight = 4.5,
    d_distance = 40,
     zeroRange = 10;
var d_path = d_drop - sightHeight + (drop_at_zero + sightHeight) * d_distance / zeroRange;
console.log("Path: " + d_path + " cm"); // outputs: Path: 12.613623122848603 cm