• 请不要在回答技术问题时复制粘贴 AI 生成的内容
realpg
0.01D
V2EX  ›  程序员

作为一个略懂 JS 的不写 JS 的开发,抬手随手写个简单的 JS,小坑真是一个接一个啊……

  •  
  •   realpg ·
    realpg · Mar 4, 2016 · 6179 views
    This topic created in 3898 days ago, the information mentioned may be changed or developed.
    一个页面,四个 input 年 1 月 1 年 2 月 2
    要求年月 1 比年月 2 早 js 进行初步过滤防止输错 不需要防止恶意 只是个简单过滤
    方便自己盲输录入错误

    挂了个 jquery 用 val()取出四个值 ay am by bm 顺手写了个这个判断:
    if ((ay * 12 + am) - (by * 12 + bm) > 0) playAlertMusic();

    然后就愉快的录数据 结果,最后数据库汇总,还是有前面比后面小的……
    百撕不得骑姐,按照那个数据重新录入,卧槽果然能通过验证

    结果,一个一个变量 debug ,粗略猜到了是字符串数字问题, ay*12 就变成 integer ,跟一个 string int 做加法,竟然不会自动把 string int 转成 int ……

    这 js 解释器啊啊啊啊。感觉大部分脚本语言都能比较好的处理好这种问题吧
    33 replies  •  2016-03-05 09:38:27 +08:00
    zythum
    zythum
    Mar 4, 2016
    1
    如果你需要明切。可以使用 parseInt , 和 toString 方法明文转换。如果你想隐式转化就不要说 js 解释器坑,你换成哪个弱类型语言都有隐式转化。
    hronro
    hronro
    Mar 4, 2016
    2
    这是坑么
    realpg
    realpg
    OP
    Mar 4, 2016
    3
    @zythum
    我没说我自己没有问题,我只是觉得这个放到弱类型语言上也是反常规的转换方式。

    我测试了几个弱类型语言,没见过 js 解释器这样的,大多数都是跟我想象的一样, int 和 string storaged integer 相加,转换成 integer 进行处理
    shunia
    shunia
    Mar 4, 2016
    4
    string + int 为什么要等于 int ?百撕不得骑姐
    shiji
    shiji
    Mar 4, 2016 via Android
    5
    还是 PHP 好哈。。弱类型
    yixiang
    yixiang
    Mar 4, 2016
    6
    自己不熟悉一门语言导致的错误的原因是自己不熟悉这门语言。
    realpg
    realpg
    OP
    Mar 4, 2016
    7
    好吧,我错了,你们都了解 js ,我不了解。
    我 PHP 病犯了,我向广大程序员道歉,我拉低了平均技术水平,我错了,以后我改。
    这贴到此为止吧。
    lincanbin
    lincanbin
    Mar 4, 2016
    8
    @realpg 你不能这么黑 PHP 。
    lxy
    lxy
    Mar 4, 2016
    9
    js 是我见过坑最多的语言……

    '5' + 1 // '51'
    '5' + true // "5true"
    '5' + false // "5false"
    '5' + {} // "5[object Object]"
    '5' + [] // "5"
    '5' + function (){} // "5function (){}"
    '5' + undefined // "5undefined"
    '5' + null // "5null"
    qianleilei
    qianleilei
    Mar 4, 2016
    10
    明明知道是弱类型为何不显示的转化?要是写 PHP 我也会强制转一下,有强迫症吧
    oott123
    oott123
    Mar 4, 2016
    11
    js 里,字符串和任何玩意儿相加结果都是字符串。
    这也常常被用来做字符串转换…
    zythum
    zythum
    Mar 4, 2016
    12
    @realpg 不管怎么说,怎么隐式转化是语言本身定的,有人喜欢这样有人喜欢那样。你用 parseInt 和 toString 写明确了也就没问题了。
    @shiji php 把字符串拼接的操作符区分开了么, php 设计的时候就是为了拼模版。估计是故意去规避这个问题。
    zythum
    zythum
    Mar 4, 2016
    13
    @lxy 字符串和任何相加结果都是字符串。会去调那个东西的 toString 或者 valueOf 。具体流程忘记了。还是翻 ECMA 规范吧。
    yeyeye
    yeyeye
    Mar 4, 2016
    14
    最近写了个 PHP 程序……写了几个小时然后直接 debug ,纳尼!直接输出了 Done (我写在尾部的 echo ),没错?不可能啊!怎么可能无错!后来才发现是 php.ini 关闭了……

    语法上没有错……但是但是……连接字符串我用的是+,于是输出了一堆奇奇怪怪的字符串(+运算符导致字符串拼接时顺序错乱了),没搞懂原因的时候整个脑袋都错乱了。
    jugelizi
    jugelizi
    Mar 4, 2016
    15
    不同浏览器还产生不同结果
    有次看到阿里的笔试题
    在 IE 和 chrome 的结果不一样 标准答案是错的
    所以写 JS 一定要规范
    ttma1046
    ttma1046
    Mar 4, 2016
    16
    string 加任何玩儿,都是把任何玩儿先变成 string, 再做 concat.
    百撕不得骑姐楼主怎么略懂 JS 的 ?
    realpg
    realpg
    OP
    Mar 4, 2016
    17
    @ttma1046 完全没学过啊,就是猜猜怎么写呗
    最基础的,没吃过猪肉还没看过猪跑啊
    bramblex
    bramblex
    Mar 4, 2016
    18
    猜测楼主其他语言也写不好……

    假设楼主是写强类型语言的,不应该犯这种字符串和数字相加的错误。
    假设楼主是写弱类型语言的,哪个弱类型语没告诉你不要用隐式类型转换的?
    aivier
    aivier
    Mar 4, 2016
    19
    每次写 C#转换数据类型都觉得很烦人....
    xuboying
    xuboying
    Mar 4, 2016
    20
    楼主可以来写 perl

    $x="1" ;
    $y = $x + 0; ### $y = 1
    字符串拼接是用小数点 "."
    xuboying
    xuboying
    Mar 4, 2016
    21
    无论是 perl5 还是 perl6 都不使用加号做拼接,避免这种低级错误
    xcodebuild
    xcodebuild
    Mar 4, 2016 via Android
    22
    @realpg 建议还是找本书看看, js 要是按照『见猪跑』的方法写遍地都是坑,你举的这个例子完全不是事。

    事实上也没几个语言是见过猪跑就能写不踩坑的,大概 Java 算一个?
    realpg
    realpg
    OP
    Mar 4, 2016
    23
    @codefalling
    没啥了,我也不是干这个的,其实就是我要录一堆数据,怕盲打录错,用 chrome 的 console 注入了个判断。
    而且出现问题第一时间我也马上明白了是哪里有问题。

    真要写这个,测试啊,设计严谨性啊,都会好好处理,而且估计也用不上我写啥复杂的 js 。
    bramblex
    bramblex
    Mar 4, 2016
    24
    @codefalling

    在这种问题上强类型的优越性就体现出来了。入股再配上纯函数,那基本不会出逻辑以外的错误
    aprikyblue
    aprikyblue
    Mar 4, 2016
    25
    依赖隐性转换,还是字符串和数字运算。。怪 js 咯
    jin5354
    jin5354
    Mar 4, 2016
    26
    连隐式类型转换的规则都不清楚,还有自信说略懂?
    aaaron7
    aaaron7
    Mar 4, 2016❤️1
    27
    动态类型一时爽,重构起来火葬场
    iscraft
    iscraft
    Mar 4, 2016
    28
    码奴的道路其实是一场雷区内的前行
    大大前天无聊 在 rpi2 中 port 装了 php7 nginx+fpm 想看下
    结果 200 ok 但页面完全空白 只是一个 phpinfo 都运行不了
    百思不得其解 搞到凌晨 5 点仍无结果 放弃 睡觉去
    隔了一天第三天早上 突然灵机一动
    php.ini 里看了一眼 short_open_tag 没打开......
    ragnaroks
    ragnaroks
    Mar 4, 2016
    29
    @aaaron7
    +∞
    HadesYang
    HadesYang
    Mar 4, 2016
    30
    Jaylee
    Jaylee
    Mar 4, 2016
    31
    @realpg 完全没学过就来就 js 坑?
    xuyinan503
    xuyinan503
    Mar 5, 2016
    33
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5176 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 117ms · UTC 06:32 · PVG 14:32 · LAX 22:32 · JFK 01:32
    ♥ Do have faith in what you're doing.