我知道由于浏览器计时器不准确,差异目前可以忽略不计,但为了知识,如果没有别的:是否有任何支持setInterval和setTimeout的浏览器,但要求它们作为延迟传递整数值?
或者,用例子改写,是:
setInterval(animate,50/3);
作为跨浏览器兼容吗?
setInterval(animate,17);
答案 0 :(得分:7)
非常安全。
(如RobG指出的,我还没有提供到DOM / JS桥的参考规则本身他敦促谨慎FWIW,相信 - 但没有参考决定性地状态 - 即ToInteger
是接口桥的一部分。这是一个jsfiddle,显示超时传递为字符串,浮点数和整数(与JS中的float类型相同),在FF8中工作正常和IE9。欢迎反馈。)
这是因为the DOM interface only accepts integers setTimeout/setInterval
的延迟,因为它们是在DOM中定义的,而不是在ECMAScript中定义的。延迟值首先适当地转换为整数值(在这方面,[JS-internal] ToInteger
函数被调用执行截断 *)。
但是,示例数字实际上会产生略有不同的结果(尽管可能不太明显): - )
这是因为,50/3
(16.66andsomemore
- > 16
)和17
指定了不同的超时。
快乐的编码。
* ToInteger
定义为sign(number) * floor(abs(number))
,不包括特殊情况。请参见第5版ECMAScript规范的第9.4节。
答案 1 :(得分:3)
Javascript在浮点数和整数之间没有真正的区别,并且在引擎盖下是相同的数据类型。 1
和1.0
在内存中有点相同。
因此,是的,您可以传递小数值而不会出现任何实际问题。这是完全有效的JavaScript。即使它确实需要一个整数,它更可能只是为你简单而无声地舍入它。
但是不要指望它是准确的! 0.1
,1
甚至4.87
的时间都可能会非常接近同时由于回调调度的粒度较低。
答案 2 :(得分:0)
我认为第二个参数将被计算为表达式,只要它返回一个数字就可以了。它似乎适用于chrome。只要确保你不要除以零!
答案 3 :(得分:0)
这些函数需要毫秒。我怀疑你可以期待任何超过10毫秒的准确度,以及浏览器enforce timer restrictions。
Firefox并不介意十进制值。您can test在您感兴趣的任何其他浏览器中。