推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
Mark24

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

  •  
  •   Mark24 · Jul 31, 2015 · 5546 views
    This topic created in 4123 days ago, the information mentioned may be changed or developed.
    37 replies  •  2015-09-04 23:40:59 +08:00
    Mark24
    Mark24
    OP
    Jul 31, 2015
    1
    JavaScript引擎在行末自动添加分号的机制,产生的坑

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

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

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

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


    其实会变成:

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


    正确的姿势是:

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

    @Mark24 return 从来都不应该与它要返回的值分成两行写
    est
    est
    Jul 31, 2015
    8
    sumhat
    sumhat
    Jul 31, 2015
    9
    for 循环中的 closure 有问题,比如:

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

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

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

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


    https://github.com/feross/standard
    bramblex
    bramblex
    Jul 31, 2015
    21
    @neetrorschach 也不支持命名分组
    bramblex
    bramblex
    Jul 31, 2015❤️1
    22
    @civet

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

    [1,2,3].map(function(x){return parseInt(x);}) //=> [ 1, 2, 3 ]
    kenshinhu
    kenshinhu
    Aug 1, 2015
    28
    @zonghua 我记得有下在搞monngoose 时,返回的结果是Document类型,直接赋值一个变量时,再修改里的的元素是失效的,这个算是 值拷贝的问题吗?
    GuangXiN
    GuangXiN
    Aug 1, 2015❤️1
    29
    @sneezry 0.1+0.2==0.3返回false不是js独有的坑呀,这是二进制无法精确表示小数导致的,C语言也有这个坑,PHP也有,Python也存在。
    sneezry
    sneezry
    Aug 1, 2015 via iPhone
    31
    @GuangXiN 原来如此!
    zonghua
    zonghua
    Aug 1, 2015
    32
    @GuangXiN 浮点器是什么原理都要深究很久吧,计算机发展也就酱紫了。
    oscarzhao
    oscarzhao
    Aug 1, 2015
    33
    拷贝对象时,JSON.parse(JSON.stringify(obj))比较蛋疼
    JSON.stringify 用在 map上面会输出为 [], 直接打印能显示出来
    civet
    civet
    Aug 3, 2015
    34
    @bramblex 不说还真不知道。现在这就是讨论“坑”,我这个是从某个国外的演讲里面看过的
    Mark24
    Mark24
    OP
    Aug 10, 2015❤️1
    35
    JavaScript排序坑
    会把数字先转换为字符串,再用字符串去排序
    ……
    反人类
    Mark24
    Mark24
    OP
    Aug 10, 2015
    36
    mingyun
    mingyun
    Sep 4, 2015
    37
    Json.stringify ()会默认忽略 undefined 的 key
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1676 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 98ms · UTC 00:29 · PVG 08:29 · LAX 16:29 · JFK 19:29
    ♥ Do have faith in what you're doing.