为啥我的游戏手柄时间戳列表减少会导致 NaN?
Posted
技术标签:
【中文标题】为啥我的游戏手柄时间戳列表减少会导致 NaN?【英文标题】:Why does my list reduction over gamepad timestamps result in NaN?为什么我的游戏手柄时间戳列表减少会导致 NaN? 【发布时间】:2017-07-06 09:44:36 【问题描述】:我对 javascript 做了一个简单的简化:
navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, 1)
当没有游戏手柄时,结果为1
。
当有一个游戏手柄时,结果为NaN
。
但是,列表是 number
值:
navigator.getGamepads().map(x => x.timestamp)
Array [ 280868.92 ]
navigator.getGamepads().map(x => typeof x.timestamp)
Array [ "number" ]
这是为什么?
我使用的是 Firefox 54.0 64 位
【问题讨论】:
【参考方案1】:navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, 1)
中的reduce 函数将1 作为第一个迭代的第一个参数。 timestamp
1 的属性是 undefined
,这就是你得到 NaN 的原因。
你可以试试这样的:
navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, timestamp: 1)
【讨论】:
【参考方案2】:当没有游戏手柄时,结果为 1。因为您的初始值为 1。这是您的 reduce 函数的第二个参数:
navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, 1)
第一个参数:(i, j) => i.timestamp * j.timestamp
第二个参数:1
当有一个游戏手柄时,你将你的函数应用到 myGamepad,然后 1
(1, myGamepad) => 1.timestamp * myGamepad.timestamp
myGamepad 有一个时间戳,但你的初始值没有,所以它返回一个 NaN
也许你可以像这样创建一个初始值
let initValue = timestamp: 1
navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, initValue )
【讨论】:
以上是关于为啥我的游戏手柄时间戳列表减少会导致 NaN?的主要内容,如果未能解决你的问题,请参考以下文章
为啥“np.inf // 2”会导致 NaN 而不是无穷大?