写 setTimeout(fn, 1),以为一秒后执行,结果函数几乎立刻就跑了。第二个参数的单位是毫秒,1 表示 1 毫秒,不是 1 秒。浏览器里的 performance.now() 也是毫秒,还带小数。

换算只有一条:乘 1000

一秒等于多少毫秒,答案是 1000。半秒是 500 毫秒,0.1 秒是 100 毫秒,2.5 秒是 2500 毫秒。继续往下,1 毫秒等于 1000 微秒,1 微秒等于 1000 纳秒,都是千进制。天、小时、分钟也顺一遍:1 分钟 60 秒,1 小时 3600 秒,1 天 86400 秒。

代码里的时间单位最容易搞错

JavaScript 的 setTimeout 和 setInterval 用毫秒,Date.now() 返回的也是毫秒时间戳。Java 的 System.currentTimeMillis() 同样是毫秒。Python 的 time.time() 返回秒,还是带小数的浮点数,跨语言复制代码时特别容易差 1000 倍。C 的 sleep 函数参数是秒,Windows API 的 Sleep 是毫秒,名字只差大小写,单位差 1000 倍。

60 帧一帧是 16.7 毫秒

显示器 60Hz,一帧的间隔是 1000 除以 60,约 16.67 毫秒。144Hz 约 6.94 毫秒,240Hz 约 4.17 毫秒。帧率越高,单帧时间越短,30Hz 时一帧约 33.3 毫秒。做动画或者游戏循环,按这个数算帧时间,比凭感觉调参数靠谱。

秒和赫兹不是一回事

Hz 表示每秒发生多少次,1Hz 是每秒 1 次,周期 1 秒;2Hz 是每秒 2 次,周期 0.5 秒即 500 毫秒。周期等于频率的倒数,单位换算时先把频率换成周期,再乘 1000,别直接把赫兹当毫秒用。音频采样率 44.1kHz 表示每秒 44100 个采样点,单个采样周期约 0.0227 毫秒。

一秒等于多少毫秒,记不住就记住 1000 这个数:秒到毫秒乘 1000,毫秒到微秒再乘 1000。写代码遇到时间参数,先翻文档确认单位,比事后查 bug 省时间。手机上的动画时长参数一般也是毫秒,改之前先看单位。