[收集贴] 晒晒你知道的 Javascript 的那些坑…… - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
Mark24
V2EX    Javascript

[收集贴] 晒晒你知道的 Javascript 的那些坑……

  •  
  •   Mark24 2015-07-31 14:53:30 +08:00 5050 次点击
    这是一个创建于 3800 天前的主题,其中的信息可能已经有所发展或是发生改变。
    37 条回复    2015-09-04 23:40:59 +08:00
    Mark24
        1
    Mark24  
    OP
       2015-07-31 14:54:15 +08:00
    Javascript引擎在行末自动添加分号的机制,产生的坑

    如果你想的是这样子的代码:

    function foo() {
    return { name: 'foo' };
    }

    如果你不小心,多了换行了,像这样
    或者这就是你心目中的“多行代码”的样子

    function foo() {
    return
    { name: 'foo' };
    }


    其实会变成:

    function foo() {
    return;
    { name: 'foo' };
    }


    正确的姿势是:

    function foo() {
    return { // 这里不会自动加分号,因为{表示语句尚未结束
    name: 'foo'
    };
    }
    RoshanWu
        2
    RoshanWu  
       2015-07-31 14:57:37 +08:00   2
    pelloz
        3
    pelloz  
       2015-07-31 14:58:19 +08:00
    数值精度不够,服务器返回的long类型的id会丢失精度,导致错误。最好直接使用String类型传数据。
    ychongsaytc
        4
    ychongsaytc  
       2015-07-31 14:59:11 +08:00
    Date
    Mark24
        5
    Mark24  
    OP
       2015-07-31 15:26:29 +08:00
    @RoshanWu 十分感谢
    thinkmore
        6
    thinkmore  
       2015-07-31 15:41:23 +08:00
    **@RoshanWu** thanks
    learnshare
        7
    learnshare  
       2015-07-31 15:53:55 +08:00
    @ychongsaytc Chrome 的 Date 和 IE 的 Date 严谨程度不同,的确坑

    @Mark24 return 从来都不应该与它要返回的值分成两行写
    est
        8
    est  
       2015-07-31 15:57:41 +08:00
    sumhat
        9
    sumhat  
       2015-07-31 16:17:08 +08:00
    for 循环中的 closure 有问题,比如:

    for (var i in elements) {
    var element = elements[i];
    doSomething(element, function() {
    console.log(element.name);
    }
    }

    log 出来永远是最后一个。
    jprovim
        10
    jprovim  
       2015-07-31 16:30:58 +08:00
    @sumhat 必Closure坑.
    mouhong
        11
    mouhong  
       2015-07-31 16:48:09 +08:00
    @sumhat 这其实不能算 Closure 的坑,是 Javascript 早期版本没有块级作用域的坑,如果用 strict mode 里的 let element = elements[i],就不会有这个问题。
    forest520
        12
    forest520  
       2015-07-31 16:52:22 +08:00
    nodejs的parseInt("000300"),猜猜结果是什么?
    kenshinhu
        13
    kenshinhu  
       2015-07-31 16:52:34 +08:00
    还有值拷贝的坑
    morethansean
        14
    morethansean  
       2015-07-31 16:52:54 +08:00
    @sumhat 这不是问题吧……这不是 feature 么……
    bramblex
        15
    bramblex  
       2015-07-31 16:57:56 +08:00
    各种坑……以及各种坑我自己造的工具……
    https://github.com/bramblex/BlxJSTK
    civet
        16
    civet  
       2015-07-31 16:58:09 +08:00
    ['10', '10', '10'].map(parseInt)
    neetrorschach
        17
    neetrorschach  
       2015-07-31 17:31:07 +08:00
    好像js的正则不支持零宽断言
    zonghua
        18
    zonghua  
       2015-07-31 17:38:54 +08:00
    @forest520 0.00300?
    @kenshinhu == === != !== null undifine
    ChefIsAwesome
        19
    ChefIsAwesome  
       2015-07-31 17:43:20 +08:00 via Android
    (Num).toFixed(n) 居然返回的是字符串
    zhea55
        20
    zhea55  
       2015-07-31 17:50:29 +08:00
    哪里坑了? 自动追加分号,这么好的功能。

    没看到老外现在代码,好多都不加分号了。

    不加分号的代码看着舒服多了啊。


    https://github.com/feross/standard
    bramblex
        21
    bramblex  
       2015-07-31 19:08:24 +08:00
    @neetrorschach 也不支持命名分组
    bramblex
        22
    bramblex  
       2015-07-31 19:12:21 +08:00   1
    @civet

    你不知道parseInt有第二个参数,以及map会给callback三个参数,那一定会坑 /w\
    sneezry
        23
    sneezry  
       2015-07-31 20:00:22 +08:00 via iPhone
    0.1+0.2==0.3
    sneezry
        24
    sneezry  
       2015-07-31 20:01:17 +08:00 via iPhone
    @forest520 8进制的?
    dong3580
        25
    dong3580  
       2015-07-31 21:27:58 +08:00
    @ChefIsAwesome
    这个是大坑啊。。。计算精度问题,
    MntCw
        26
    MntCw  
       2015-07-31 22:13:15 +08:00   1
    如果了解Javascript解析/编译原理,就不会有这些问题。原理读得太少,上手就是操作,等发现问题了就把这些归类为坑。
    dant
        27
    dant  
       2015-07-31 22:25:30 +08:00
    [1,2,3].map(parseInt) //=> [ 1, NaN, NaN ]

    [1,2,3].map(function(x){return parseInt(x);}) //=> [ 1, 2, 3 ]
    kenshinhu
        28
    kenshinhu  
       2015-08-01 01:12:16 +08:00
    @zonghua 我记得有下在搞monngoose 时,返回的结果是Document类型,直接赋值一个变量时,再修改里的的元素是失效的,这个算是 值拷贝的问题吗?
    GuangXiN
        29
    GuangXiN  
       2015-08-01 01:30:40 +08:00   1
    @sneezry 0.1+0.2==0.3返回false不是js独有的坑呀,这是二进制无法精确表示小数导致的,C语言也有这个坑,PHP也有,Python也存在。
    dcoder
        30
    dcoder  
       2015-08-01 02:17:38 +08:00
    sneezry
        31
    sneezry  
       2015-08-01 08:33:10 +08:00 via iPhone
    @GuangXiN 原来如此!
    zonghua
        32
    zonghua  
       2015-08-01 09:36:24 +08:00
    @GuangXiN 浮点器是什么原理都要深究很久吧,计算机发展也就酱紫了。
    oscarzhao
        33
    oscarzhao  
       2015-08-01 14:35:17 +08:00
    拷贝对象时,JSON.parse(JSON.stringify(obj))比较蛋疼
    JSON.stringify 用在 map上面会输出为 [], 直接打印能显示出来
    civet
        34
    civet  
       2015-08-03 09:52:07 +08:00
    @bramblex 不说还真不知道。现在这就是讨论“坑”,我这个是从某个国外的演讲里面看过的
    Mark24
        35
    Mark24  
    OP
       2015-08-10 13:05:22 +08:00   1
    Javascript排序坑
    会把数字先转换为字符串,再用字符串去排序
    ……
    反人类
    Mark24
        36
    Mark24  
    OP
       2015-08-10 13:06:32 +08:00
    mingyun
        37
    mingyun  
       2015-09-04 23:40:59 +08:00
    Json.stringify ()会默认忽略 undefined 的 key
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5452 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 02:55 PVG 10:55 LAX 18:55 JFK 21:55
    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