为啥我的游戏手柄时间戳列表减少会导致 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 而不是无穷大?

为啥逻辑回归中更高的学习率会产生 NaN 成本?

为啥 jumpForce 在检查器中自动更改?

即使我遵循公式,为啥我的 2 个向量的角度函数返回 NaN

为啥这个 INotifyCollectionChanged 会导致内存泄漏?

为啥我在本地文件中得到 NaN 但我的小提琴很好