为什么我对游戏手柄时间戳的列表缩减会导致 NaN?

Why does my list reduction over gamepad timestamps result in NaN?

我在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 位

navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, 1) 中的 Reduce 函数获取 1 作为第一次迭代的第一个参数。 timestamp 属性 of 1 是 undefined,这就是你得到 NaN 的原因。

您可以尝试这样的操作:

navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, {timestamp: 1})

当没有游戏手柄时,结果为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 有一个时间戳,但你的初始值有 none,所以它 returns 一个 NaN

也许你可以像这样创建一个初始值

let initValue = {timestamp: 1}
navigator.getGamepads().reduce((i, j) => i.timestamp * j.timestamp, initValue )