谁知道在 Nodejs 下执行这段代码为什么是这个结果?

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

谁知道在 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


16 回复

没这个问题

0.10.28 哥们从哪找的包啊,怕不是活在 IOjs 的时代。




嗯 低版本 node 会有问题 我这是 v0.10.28
某些高版本的没问题。。。

一路 -11 from v6.11.1。

你这版本低的有些过了, 都 15 年上半年的版本了。 当时 html5 es6 推出才多久。
node 才还是新兴产品,有坑很正常。

10.* 都不远了,你搞 0.10

嗯啊 自然是由于某些原因才用低版本 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

原因分析

  1. let a = 1; 定义了一个块作用域的变量 a,初始值为 1。
  2. function increment() { ... } 定义了一个函数 increment,该函数将变量 a 自增 1 并返回其值。
  3. console.log(increment()); 第一次调用 increment 函数时,a 从 1 增加到 2,并返回 2,所以输出 2。
  4. console.log(increment()); 第二次调用 increment 函数时,a 从 2 增加到 3,并返回 3,所以输出 3。

如果你的代码执行结果与预期不符,可能的原因包括:

  • 变量作用域问题(例如使用了 var 而不是 letconst)。
  • 异步代码执行顺序问题(例如使用了 setTimeoutPromisesasync/await)。
  • 函数闭包导致的变量绑定问题。

请提供具体的代码,以便我能给出更精确的分析和解释。

回到顶部