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 · 4707 次点击
    这是一个创建于 3433 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   2938 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:22 · PVG 22:22 · LAX 06:22 · JFK 09:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.