V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
song0071000
V2EX  ›  Node.js

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

  •  
  •   song0071000 · 2017-08-07 14:50:45 +08:00 · 2559 次点击
    这是一个创建于 2683 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    15 条回复    2017-08-08 14:11:51 +08:00
    mooncakejs
        1
    mooncakejs  
       2017-08-07 14:54:00 +08:00
    测试没有 20
    yangff
        2
    yangff  
       2017-08-07 14:55:08 +08:00
    没这个问题
    yangff
        3
    yangff  
       2017-08-07 14:55:47 +08:00
    v6.10.2
    zpf124
        4
    zpf124  
       2017-08-07 15:06:42 +08:00
    0.10.28 哥们从哪找的包啊,怕不是活在 IOjs 的时代。
    song0071000
        5
    song0071000  
    OP
       2017-08-07 15:07:18 +08:00
    @mooncakejs
    @yangff

    嗯 低版本 node 会有问题 我这是 v0.10.28
    某些高版本的没问题。。。
    zpf124
        6
    zpf124  
       2017-08-07 15:10:23 +08:00
    一路 -11 from v6.11.1。
    zpf124
        7
    zpf124  
       2017-08-07 15:14:16 +08:00
    @song0071000 你这版本低的有些过了, 都 15 年上半年的版本了。 当时 html5 es6 推出才多久。
    node 才还是新兴产品,有坑很正常。
    learnshare
        8
    learnshare  
       2017-08-07 15:21:31 +08:00
    10.* 都不远了,你搞 0.10
    song0071000
        9
    song0071000  
    OP
       2017-08-07 15:30:24 +08:00
    嗯啊 自然是由于某些原因才用低版本 node 不然早拥抱新版本了
    不过话说低版本的 Math.min 的这个坑 没人踩过吗?有人研究过这到底是啥原因没?

    @zpf124
    @learnshare
    zpf124
        10
    zpf124  
       2017-08-07 15:46:26 +08:00
    @song0071000 也许有人踩,但踩了人家也应该提 issue 在新版本修复了...
    不行就自己实现一个 min 的方法。
    jianguiqubaa
        11
    jianguiqubaa  
       2017-08-07 18:13:46 +08:00   ❤️ 1
    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 的都好了太多倍了。。。
    smallpath
        12
    smallpath  
       2017-08-07 22:13:43 +08:00 via Android
    楼主用了魔改的 node ?
    song0071000
        13
    song0071000  
    OP
       2017-08-08 11:34:51 +08:00
    @jianguiqubaa 嗯 向高版本看齐 我去仔细看看你发的链接
    感谢感谢
    song0071000
        14
    song0071000  
    OP
       2017-08-08 11:36:27 +08:00
    @smallpath ? 没有 就是官方低版本 node
    qfdk
        15
    qfdk  
       2017-08-08 14:11:51 +08:00 via iPhone
    好像 min 里面还有个参数 要指定十进制
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1288 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:58 · PVG 07:58 · LAX 15:58 · JFK 18:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.