javascript typeof / NaN 混淆

Posted

技术标签:

【中文标题】javascript typeof / NaN 混淆【英文标题】:javascript typeof / NaN confusion 【发布时间】:2014-08-13 23:04:08 【问题描述】:

所以我正在使用画布 API 制作一个小游戏,而且我对 javascript 还很陌生。但是,当我努力让角色能够在 360 度全方位射击时,我在下面的代码中遇到了一个错误(这个函数应该返回鼠标位置和玩家位置之间的角度)

calculateAngle : function(x,y)

    var opp = 0; //opposite
    var adj = 0; //adjecent
    var rad = 0; //radian
    var ang = 0; //angle

    //side lengths
    var x1 = gfx.player_center_x //the player x position
    var x2 = mouse_x; //the mouse x position
    var y1 = gfx.player_center_y; //the player y position
    var y2 = mouse_y; //the mouse y position

    //find 2 lengths of the triangle
    opp = (y2 - y1);
    adj = (x2 - x1);

    //find the missing angle between the adjecent and hypotenuse
    rad = Math.atan2(adj, opp);
    ang = rad * 180 / Math.PI;

    //-------------------------//
    console.log(ang); //prints: NaN
    console.log(typeof ang); //prints: number 
    //------------------------//

    return ang;

执行时返回 NaN 但 ang 是一个数字! 为什么javascript认为变量ang不是数字?它声明为0,typeof返回数字,请帮忙!

更新:粗心的错误,x1 和 y1 等改变了位置,我忘了实现它,谢谢你的回答

【问题讨论】:

你从哪里得到mouse_xmouse_y 变量没有类型。 ang 不一定是数字 - 它最初存储一个数字 (0)...typeof 表示它是一个数字。 NaN 表示ang 的最新值(计算)具有确定为不是数字的结果。计算确定它不是数字,因此返回NaN。查看计算 (rad * 180 / Math.PI),我假设 rad 存在“问题”,以使计算出错 rad 可能已经是 NaN 在我看来,它很可能不是 rad。您可以将字符串相乘,它们将转换为数字类型。我确实怀疑 x1、x2、y1 或 y2 存在问题。其中之一可能是字符串或已经是 NaN,因为您不能减去字符串。 @tomysshadow rad 基于 x1x2y1y2,所以这就是ang 中的问题计算。不过你是对的 - 问题可能出在较早的计算中(例如 oppadj)。并且你可以减去字符串(它们是由运算符强制完成的操作),只要它们代表数字。 【参考方案1】:

NaN 是 IEEE 754 “非数字”值。在 javascript 中它属于数字类型,即使它被称为 NaN(非数字)。这是javascript的一个怪癖。甚至根据 IEEE 浮点算术标准 (IEEE 754): 算术格式:二进制和十进制浮点数据集,由有限数(包括有符号零和次正规数)、无穷大和特殊的“非数字”值 (NaN) 组成。

【讨论】:

【参考方案2】:

NaN 是一个特殊值。在内部它是一个数字,但它是一个特定的值,具有“这个值在数学上未定义”的特殊含义。任何导致未定义数字(例如0/0)的操作都会导致NaN,但它仍然是一个数字!只是没有确定的数字。

Math.atan2 的实现方式不能返回NaN(因为它处理“边缘情况”,其中y/x 将是Infinity - 另一个不是定义数字的“数字”)所以几乎可以肯定你的NaN 来自opp 和/或adj 的计算。您应该记录这些值并查看发生了什么。

【讨论】:

而且由于 opp/adj 来自 x1、x2、y1 和 y2,因此计算字符和/或鼠标位置的方式很可能是问题所在。也许他正在尝试使用 CSS 获取角色的位置,从而导致了问题。我建议将角色的位置存储在变量中,而不是尝试从 DOM 访问值。

以上是关于javascript typeof / NaN 混淆的主要内容,如果未能解决你的问题,请参考以下文章

NaN 在 Javascript 中总是一个虚假的值吗?

JavaScript中判断nullundefined与NaN的方法

js中typeof的返回值类型共有七种

JavaScript数据类型

javascript的==和===,以及if(xxx)总结

typeof