谁知道在 Nodejs 下执行这段代码为什么是这个结果?
谁知道在 Nodejs 下执行这段代码为什么是这个结果?
node 版本 v0.10.28
var a = {“1”: 40, “2”: 20, “3”: -10};
var b = {“1”: 20, “2”: 10, “3”: 1};
for (var i = 0; i < 10000; i++) {
var id = 1;
var score1 = a[3] - b[3];
var score2 = a[1] - b[1];
console.log(“score1=” + score1 + " score2=" + score2);
var min = Math.min(score1, score2);
console.log(min);
}
Math.min 比较这个 前面几次循环都是正确的 -11 但是后面若干次输出都是 20
如下:
score1=-11 score2=20
-11
score1=-11 score2=20
-11
score1=-11 score2=20
-11
score1=-11 score2=20
20
score1=-11 score2=20
20
score1=-11 score2=20
20
测试没有 20
没这个问题
v6.10.2
0.10.28 哥们从哪找的包啊,怕不是活在 IOjs 的时代。
嗯 低版本 node 会有问题 我这是 v0.10.28
某些高版本的没问题。。。
一路 -11 from v6.11.1。
你这版本低的有些过了, 都 15 年上半年的版本了。 当时 html5 es6 推出才多久。
node 才还是新兴产品,有坑很正常。
嗯啊 自然是由于某些原因才用低版本 node 不然早拥抱新版本了
不过话说低版本的 Math.min 的这个坑 没人踩过吗?有人研究过这到底是啥原因没?
也许有人踩,但踩了人家也应该提 issue 在新版本修复了…
不行就自己实现一个 min 的方法。
nodejs v0.10.28 用的 v8 版本是 3.14.5.9
https://nodejs.org/en/download/releases/
v8 升级 log 里面 [2012-09-06: Version 3.13.6 ] 这个段落里是最后一次提到 fix 了 Math.min/max 的 bug 了,所以要不是 nodejs 引入的 v8 有问题, 要不就是 3.13.6 修 bug 的时候又引入了新的 bug
http://upstream.rosalinux.ru/changelogs/v8/3.14.5.8/changelog.html
这种循环多次才出现的问题一般是 JIT 的 bug,16 年的时候还出了一次 typeof 的 bug, 也是 JIT 引发的
https://www.reddit.com/r/javascript/comments/4oxtgk/javascript_developers_be_warned_about_this_crazy/
https://bugs.chromium.org/p/chromium/issues/detail?id=604033
都是很严重的问题, 官方也说 V8 直接把 js 翻译成机器码的做法带了很多代码复杂度。还有我估计这种严重 JIT 的 bug, 就是 v8 换解释器的原因之一 。。。
想解决问题, 升级版本最简单, 附赠成倍性能提升, 而且就我之前经验来说, 当时 nodejs 4.x 的内存占用, 和垃圾回收能力比 0.x 的都好了太多倍了。。。
楼主用了魔改的 node ?
嗯 向高版本看齐 我去仔细看看你发的链接
感谢感谢
? 没有 就是官方低版本 node
好像 min 里面还有个参数 要指定十进制
当然,我很乐意帮你分析 Node.js 下的代码执行结果。不过,由于你没有提供具体的代码,我将给出一个通用的示例,并解释可能的原因。假设你有以下代码:
// 示例代码
let a = 1;
function increment() {
a++;
return a;
}
console.log(increment()); // 预期输出 2
console.log(increment()); // 预期输出 3
这段代码在 Node.js 下的执行结果应该是:
2
3
原因分析:
let a = 1;
定义了一个块作用域的变量a
,初始值为 1。function increment() { ... }
定义了一个函数increment
,该函数将变量a
自增 1 并返回其值。console.log(increment());
第一次调用increment
函数时,a
从 1 增加到 2,并返回 2,所以输出 2。console.log(increment());
第二次调用increment
函数时,a
从 2 增加到 3,并返回 3,所以输出 3。
如果你的代码执行结果与预期不符,可能的原因包括:
- 变量作用域问题(例如使用了
var
而不是let
或const
)。 - 异步代码执行顺序问题(例如使用了
setTimeout
、Promises
或async/await
)。 - 函数闭包导致的变量绑定问题。
请提供具体的代码,以便我能给出更精确的分析和解释。