Javascript -- 将数字用作整数可靠吗?

Javascript -- reliable to use numbers as integers?

为什么在 Javascript 中将数字用作整数显然是安全的?我的意思是,像下面这样的循环通常是 "trusted" 到 运行 预期的次数,即使最终循环需要精确比较 (10000 == 10000) 时这两个值是浮点数而不是整数。是否有某种内置的舍入功能使它安全可靠——或者这是可怕且不可信的编码?谢谢

--编辑--

有趣的是,有一个声明的安全整数范围。我不知道 MAX_SAFE_INTEGER。我们都知道 2 + 2 = 3.9999 的标准抱怨。我注意到 MAX_SAFE_INTEGER 被列为 ECMAScript-6 那么这是否意味着 IEEE-754 实际上没有提到安全整数范围?

var cnt = 0;
for (var i=0 ; i<=10000 ; i++){
  // loop 10001 times
  cnt++;
}
alert('cnt = '+ cnt);

首先,最终循环不要求两个值相等。只是 i 小于 10000.

其次,JavaScript 中的 Number 类型将整数值准确地向上(和向下)到一个点。您可以访问 Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER 属性来查看您的 browser/engine.

的安全范围是多少

如果你想检查 Number 的实例是否为整数,只需使用 Number.isInteger() 方法。

var i = 10, e = document.getElementById('message');
if(Number.isInteger(i)) {
  e.innerHTML = "i is an integer";
} else {
  e.innerHTML = "i is not an integer";
}
<div id='message'></div>

IEEE-754 双精度浮点数(JavaScript 使用的那种)有一个非常 宽的范围,它们精确地 表示整数,特别是 -9,007,199,254,740,991 到 9,007,199,254,740,991。 (这些值作为常量添加到 JavaScript 的 Number 函数中:MIN_SAFE_INTEGER and MAX_SAFE_INTEGER。)超出该范围,您确实可能 运行 陷入困境。

事实上,如果不是safety,这个循环永远不会结束:

var n, safety;
safety = 0;
for (n = 9007199254740990; n != 9007199254740999; ++n) {
  if (++safety === 20) { // Long after `n` should have matched
    snippet.log("Had to break out!");
    break;
  }
  snippet.log("n = " + n);
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>