在Javascript中乘以后,数字何时以及为什么评估为NaN?

时间:2013-07-18 08:30:23

标签: javascript cordova numbers nan

根据我的经验,我知道,在进行某种划分或尝试使用字符串编号时,我可以获得NaN,而实际上它不包含数字。当我能得到NaN时,还有其他任何情况吗?特别是 - 是否有可能从乘法中得到它?

这是我在PhoneGap应用程序中使用的一段代码:

var g = 9.80665;

acceleration.x = (acceleration.x * g).toFixed(2);
acceleration.y = (acceleration.y * g).toFixed(2);
acceleration.z = ((acceleration.z + 1) * g).toFixed(2);

accelerationbase PhoneGap object我很难相信,它包含一个字符串或除浮动之外的任何其他值,可能会导致NaN

但是,在某些情况下(在某些特定设备上),我从上面得到NaN

使用这样的代码“保护”上面的值不是问题:

acceleration.x = (parseFloat(acceleration.x) || 0) + ' m/s\u00b2';
acceleration.y = (parseFloat(acceleration.y) || 0) + ' m/s\u00b2';
acceleration.z = (parseFloat(acceleration.z) || 0) + ' m/s\u00b2';

但是,我真的好奇,何时以及为什么在做了一些值的乘法之后我能得到NaN

顺便说一句:我在MDN看过this,在Stack Overflow看到了many related answers here,但没有给我任何帮助或回答我的问题。

3 个答案:

答案 0 :(得分:4)

将数字乘以无法转换为数字的数字时,您将获得NaN。

1 * '100'         // 100 because '100' will be converted to 100
1 * ''            // 0 because '' will be converted to 0
1 * 'ten'         // NaN because 'ten' can't be converted to a number
1 * []            // 0 because [] converted to number will be 0
1 * [123]         // 123 because [] will be 123
1 * ['ten']       // NaN
1 * {}            // NaN
1 * true          // 1 because true will be 1
1 * false         // 0
1 * null          // 0
1 * undefined     // NaN, undefined can't be converted to number
1 * function(){}  // NaN

函数'isNaN'检查表达式是否可以转换为数字o。你需要检查两个乘法的数字,以确认两者都是数字以避免错误。

为了完整起见,要知道变量是否正好是NaN,您必须将其与自身进行比较:

var a = NaN;
if (a != a) console.log('a is NaN');

之所以发生这种情况,是因为NaN被定义为与所有事物都不相等,包括它自己。

答案 1 :(得分:2)

您确定,价值永远不会被定义吗?文档没有这么说,但我认为这可能是可能的。

http://docs.phonegap.com/en/1.0.0/phonegap_accelerometer_accelerometer.md.html#Acceleration

答案 2 :(得分:1)

至少在Chrome和Firefox中

0 * Infinity ----> NaN

Infinity * Infinity3.14159 * InfinityInfinity + Infinity表现良好。它们都是Infinity

Infinity - Infinity也是NaN

您可能认为自己没有Infinity,但0.000001/0就足以创建一个{{1}}。