V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
realpg
V2EX  ›  程序员

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

  •  
  •   realpg ·
    realpg · 2016-03-04 11:13:32 +08:00 · 4852 次点击
    这是一个创建于 3188 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个页面,四个 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
       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
       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
       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
       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
        33
    xuyinan503  
       2016-03-05 09:38:27 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3357 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:04 · PVG 20:04 · LAX 04:04 · JFK 07:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.