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_x
和mouse_y
?
变量没有类型。 ang
不一定是数字 - 它最初存储一个数字 (0
)...typeof
表示它是一个数字。 NaN
表示ang
的最新值(计算)具有确定为不是数字的结果。计算确定它不是数字,因此返回NaN
。查看计算 (rad * 180 / Math.PI
),我假设 rad
存在“问题”,以使计算出错
rad 可能已经是 NaN
在我看来,它很可能不是 rad。您可以将字符串相乘,它们将转换为数字类型。我确实怀疑 x1、x2、y1 或 y2 存在问题。其中之一可能是字符串或已经是 NaN,因为您不能减去字符串。
@tomysshadow rad
基于 x1
、x2
、y1
或y2
,所以这就是ang
中的问题计算。不过你是对的 - 问题可能出在较早的计算中(例如 opp
或 adj
)。并且你可以减去字符串(它们是由运算符强制完成的操作),只要它们代表数字。
【参考方案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 混淆的主要内容,如果未能解决你的问题,请参考以下文章