作为一个略懂 JS 的不写 JS 的开发,抬手随手写个简单的 JS,小坑真是一个接一个啊…… - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
realpg
0.01D
V2EX    程序员

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

  •  
  •   realpg
    PRO
    realpg 2016-03-04 11:13:32 +08:00 5339 次点击
    这是一个创建于 3558 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个页面,四个 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 条回复    2016-03-05 09:38:27 +08:00
    zythum
        1
    zythum  
       2016-03-04 11:21:29 +08:00
    如果你需要明切。可以使用 parseInt , 和 toString 方法明文转换。如果你想隐式转化就不要说 js 解释器坑,你换成哪个弱类型语言都有隐式转化。
    hronro
        2
    hronro  
       2016-03-04 11:26:16 +08:00
    这是坑么
    realpg
        3
    realpg  
    OP
    PRO
       2016-03-04 11:26:51 +08:00
    @zythum
    没说我自己没有问题,我只是觉得这个放到弱类型语言上也是反常规的转换方式。

    我测试了几个弱类型语言,没见过 js 解释器这样的,大多数都是跟我想象的一样, int 和 string storaged integer 相加,转换成 integer 进行处理
    shunia
        4
    shunia  
       2016-03-04 11:27:15 +08:00
    string + int 为什么要等于 int ?百撕不得骑姐
    shiji
        5
    shiji  
       2016-03-04 11:27:28 +08:00 via Android
    还是 PHP 好哈。。弱类型
    yixiang
        6
    yixiang  
       2016-03-04 11:27:34 +08:00
    自己不熟悉一门语言导致的错误的原因是自己不熟悉这门语言。
    realpg
        7
    realpg  
    OP
    PRO
       2016-03-04 11:28:59 +08:00
    好吧,我错了,你们都了解 js ,我不了解。
    我 PHP 病犯了,我向广大程序员道歉,我拉低了平均技术水平,我错了,以后我改。
    这贴到此为止吧。
    lincanbin
        8
    lincanbin  
       2016-03-04 11:31:49 +08:00
    @realpg 你不能这么黑 PHP 。
    lxy
        9
    lxy  
       2016-03-04 11:33:26 +08:00
    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
        10
    qianleilei  
       2016-03-04 11:35:25 +08:00
    明明知道是弱类型为何不显示的转化?要是写 PHP 我也会强制转一下,有强迫症吧
    oott123
        11
    oott123  
       2016-03-04 11:39:57 +08:00
    js 里,字符串和任何玩意儿相加结果都是字符串。
    这也常常被用来做字符串转换…
    zythum
        12
    zythum  
       2016-03-04 11:40:37 +08:00
    @realpg 不管怎么说,怎么隐式转化是语言本身定的,有人喜欢这样有人喜欢那样。你用 parseInt 和 toString 写明确了也就没问题了。
    @shiji php 把字符串拼接的操作符区分开了么, php 设计的时候就是为了拼模版。估计是故意去规避这个问题。
    zythum
        13
    zythum  
       2016-03-04 11:45:28 +08:00
    @lxy 字符串和任何相加结果都是字符串。会去调那个东西的 toString 或者 valueOf 。具体流程忘记了。还是翻 ECMA 规范吧。
    yeyeye
        14
    yeyeye  
       2016-03-04 11:46:14 +08:00
    最近写了个 PHP 程序……写了几个小时然后直接 debug ,纳尼!直接输出了 Done (我写在尾部的 echo ),没错?不可能啊!怎么可能无错!后来才发现是 php.ini 关闭了……

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

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

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

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

    真要写这个,测试啊,设计严谨性啊,都会好好处理,而且估计也用不上我写啥复杂的 js 。
    bramblex
        24
    bramblex  
       2016-03-04 13:10:56 +08:00
    @codefalling

    在这种问题上强类型的优越性就体现出来了。入股再配上纯函数,那基本不会出逻辑以外的错误
    aprikyblue
        25
    aprikyblue  
       2016-03-04 13:52:11 +08:00
    依赖隐性转换,还是字符串和数字运算。。怪 js 咯
    jin5354
        26
    jin5354  
       2016-03-04 14:12:33 +08:00
    连隐式类型转换的规则都不清楚,还有自信说略懂?
    aaaron7
        27
    aaaron7  
       2016-03-04 14:21:14 +08:00   1
    动态类型一时爽,重构起来火葬场
    iscraft
        28
    iscraft  
       2016-03-04 14:40:49 +08:00
    码奴的道路其实是一场雷区内的前行
    大大前天无聊 在 rpi2 中 port 装了 php7 nginx+fpm 想看下
    结果 200 ok 但页面完全空白 只是一个 phpinfo 都运行不了
    百思不得其解 搞到凌晨 5 点仍无结果 放弃 睡觉去
    隔了一天第三天早上 突然灵机一动
    php.ini 里看了一眼 short_open_tag 没打开......
    ragnaroks
        29
    ragnaroks  
       2016-03-04 14:57:02 +08:00
    @aaaron7
    +∞
    HadesYang
        30
    HadesYang  
       2016-03-04 16:02:26 +08:00
    Jaylee
        31
    Jaylee  
       2016-03-04 16:13:03 +08:00
    @realpg 完全没学过就来就 js 坑?
    xuyinan503
      &nbp; 33
    xuyinan503  
       2016-03-05 09:38:27 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     850 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 19:29 PVG 03:29 LAX 11:29 JFK 14:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86