V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
doubleflower
V2EX  ›  JavaScript

今天又看到一个新的 javascript 怪异笑话

  •  
  •   doubleflower · 2018-04-18 12:20:11 +08:00 · 6250 次点击
    这是一个创建于 2415 天前的主题,其中的信息可能已经有所发展或是发生改变。
    > parseInt(0.000001)
    0

    > parseInt(0.0000001)
    1
    ljsh093
        1
    ljsh093  
       2018-04-18 12:27:09 +08:00
    F12 试了一下还真是
    huiyifyj
        2
    huiyifyj  
       2018-04-18 12:33:48 +08:00 via Android
    👻诡异的 js😂
    yangg
        3
    yangg  
       2018-04-18 12:38:40 +08:00   ❤️ 1
    parseInt(string, radix)
    If the string argument is not a string, then it is converted to a string (using the ToString abstract operation). Leading whitespace in the string argument is ignored.
    String(0.000001)
    String(0.0000001)

    总想搞个大新闻。。。
    murmur
        4
    murmur  
       2018-04-18 12:41:56 +08:00
    @yangg 要点不是这个 是太长的小数自动转了科学计数法 这种坑不是每个人都记得到的
    TtiGeR
        5
    TtiGeR  
       2018-04-18 12:52:32 +08:00 via iPhone   ❤️ 1
    所以 JavaScript 有那么多人爱啊 像个有个性有脾气的女孩 总是会有让你出乎意料的时候
    Mutoo
        6
    Mutoo  
       2018-04-18 13:06:15 +08:00   ❤️ 2
    MDN 文档里已经解释了 Because some numbers include the e character in their string representation (e.g. 6.022e23), using parseInt to truncate numeric values will produce unexpected results when used on very large or very small numbers.
    muziki
        7
    muziki  
       2018-04-18 13:08:15 +08:00 via iPhone
    这语言真烂
    geelaw
        8
    geelaw  
       2018-04-18 13:09:20 +08:00
    因为这个用法不是 intended。如果你想把浮点数变换为整数,你可以使用 Math.floor/ceil/round/trunc,当然结果还是浮点数。
    SourceMan
        9
    SourceMan  
       2018-04-18 13:17:20 +08:00
    说这语言真烂的,楼下是不是也搞个其他语言的示例出来
    DOLLOR
        10
    DOLLOR  
       2018-04-18 13:53:33 +08:00
    日常黑动态类型语言。

    parseInt(string, radix)
    第一个参数是 String,你非要传一个 Number 进去,造成不可预知问题,怪我咯?
    SuperMild
        11
    SuperMild  
       2018-04-18 13:55:04 +08:00
    烂没关系,它命好啊,时来运转,不优秀照样能混得风生水起。

    其实 Javascript 也有很多优点,表现力很强,很灵活,用来写小东西很方便,而这正符合这个语言本来的目的,因此可以说语言设计是成功的。
    hjdtl
        12
    hjdtl  
       2018-04-18 13:57:26 +08:00
    已经 8102 年了,为什么还有这样的帖子。。。
    orangeade
        13
    orangeade  
       2018-04-18 14:06:13 +08:00   ❤️ 2
    @DOLLOR #9
    python 也是动态语言,然而
    >>> int(0.000001)
    0
    >>> int(0.0000001)
    0

    int(x, base=10)
    Convert a number or string x to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating point numbers, this truncates towards zero.

    If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in radix base.


    明明是设计问题
    doubleflower
        14
    doubleflower  
    OP
       2018-04-18 14:09:43 +08:00
    @DOLLOR JS 是弱类型,很多错误会被掩盖,python 同样是动态类型它是强类型,碰到不合理的错误会报错
    这是先天设计问题,只能靠 ts 之类的来救了
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       2018-04-18 14:20:14 +08:00
    typescript 检查开起来 直接报错
    wengjin456123
        16
    wengjin456123  
       2018-04-18 15:45:56 +08:00
    The parseInt() function parses a string argument and returns an integer of the specified radix (the base in mathematical numeral systems). 了解一下?
    wbgbg
        17
    wbgbg  
       2018-04-18 16:01:06 +08:00   ❤️ 1
    我不看接口文档,我想传什么类型就传什么类型,结果不符合我的心意就是接口的问题 :doge:
    Pastsong
        18
    Pastsong  
       2018-04-18 16:04:49 +08:00
    想看奇技淫巧吗 :doge:

    ~~0.000001
    > 0
    ~~0.0000001
    > 0
    seancheer
        19
    seancheer  
       2018-04-18 16:49:40 +08:00
    @doubleflower 弱类型真不是可以出现这种奇葩问题的理由,想起 js 那个== != 的表格,连数学里最基本的传递性都能出问题,各种奇葩问题表明这语言从设计之初就很随意。。楼上说的很对,js 确实命好,赶上了移动互联网,这要是换其他语言这不严谨早死一万遍了。
    beny2mor
        20
    beny2mor  
       2018-04-18 17:36:46 +08:00
    parseInt:你传了个 String 怪我喽?
    beny2mor
        21
    beny2mor  
       2018-04-18 17:42:24 +08:00
    哦不对 传的是 Number
    doubleflower
        22
    doubleflower  
    OP
       2018-04-18 17:50:50 +08:00
    @beny2mor JS 就别提类型的事,js 基本设计就是在需要的时候自动转换类型,1+'2'这种也是语言许可的合格语句
    SakuraKuma
        23
    SakuraKuma  
       2018-04-18 18:21:45 +08:00 via Android
    @doubleflower 对啊 需要的时候转换类型啊。 但 parseint 第一个参数是 string 啊。帮你转了 :doge
    doubleflower
        24
    doubleflower  
    OP
       2018-04-18 18:25:03 +08:00
    @SakuraKuma 说的就是这个啊,转到 String 的结果一会正常表示,一会变科学计数了,哪个别的语言会这样?
    anianj
        25
    anianj  
       2018-04-18 18:27:03 +08:00
    世界上最烂的语言,那又怎么样?要不然你用 java 写前端?
    SakuraKuma
        26
    SakuraKuma  
       2018-04-18 18:52:05 +08:00
    @doubleflower ? 又到了科学计数了? 处理大数运算很多语言都不能一个变量吧?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5373 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:20 · PVG 17:20 · LAX 01:20 · JFK 04:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.