传递setInterval或setTimeout是否可以安全地进行小数延迟?

5 javascript cross-browser settimeout setinterval

我知道由于不准确的浏览器计时器,差异目前可以忽略不计,但为了知识,如果没有别的:是否有任何支持setInterval和setTimeout的浏览器,但要求它们作为延迟传递整数值?

或者,用例子改写,是这样的:

setInterval(animate,50/3);
Run Code Online (Sandbox Code Playgroud)

作为跨浏览器兼容吗?

setInterval(animate,17);
Run Code Online (Sandbox Code Playgroud)

小智 7

这是非常安全的.

(正如RobG所指出的那样,我没有提供DOM/JS桥接规则本身的参考,他敦促谨慎.我相信FWIW - 但没有提到最终状态 - 这ToInteger 接口桥的一部分.是一个jsfiddle显示超时作为字符串,浮点数和整数(与JS中的浮点类型相同)传递,在FF8和IE9中工作正常.欢迎反馈.)

这是因为DOM接口只接受延迟的整数setTimeout/setInterval - 是的,这些是在DOM中定义的,而不是在ECMAScript中定义的.首先将延迟值适当地转换为整数值(在这方面,ToInteger调用[JS-internal] 函数执行截断*).

但是,示例数字实际上会产生略微不同的结果(尽管可能不是很明显):-)

这是因为,50/3(16.66andsomemore- > 16)并17 指定不同的超时.

快乐的编码.


*ToInteger被定义为sign(number) * floor(abs(number)),不包括特殊情况.请参见第5版ECMAScript规范的第9.4节.


Ale*_*yne 5

JavaScript 对浮点数和整数没有真正的区别,并且在底层是相同的数据类型。 11.0在内存中是逐位相同的。

因此,是的,您可以传递小数值而不会出现任何实际问题。这是完全有效的 JavaScript。即使它确实需要一个整数,它也更有可能简单地、默默地为您舍入它。

但不要指望它是准确的! 由于回调调度的粒度较低,时间0.11甚至4.87可能会在非常接近的同一时间触发。