日期:2014-05-16 浏览次数:20360 次
昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可以一起看看,第一次翻译技术文章表示压力很大,呵呵,有不足的地方请指出。
写在最前面
这篇英文来自codeproject,原文A Collection of JavaScript Gotchas。我看了以后颇受启发,就把他翻译过来了,呵呵,第一次翻译这么长的技术文章,有什么错误请大家指出哦。另外,译文允许转载,但请在页面明显处标明以下信息:
英文原文:A Collection of JavaScript Gotchas
译文作者:王国峰
译文标题:Javascript中的陷阱大集合【译】
译文链接:http://www.itivy.com/ivy/archive/2011/11/13/my-javascript-gotchas.html
谢谢合作!
本文主要介绍怪异的Javascript,毋庸置疑,它绝对有怪异的一面。当软件开发者开始使用世界上使用最广泛的语言编写代码时,他们会在这个过 程中发现很多有趣的“特性”。即便是老练的Javascript开发者也可以在本文找到一些有趣的新陷阱,请留意这些陷阱,当然也可以尽情享受由这些陷阱 带来的“乐趣”!
函数和操作符
双等号
==操作符比较时会进行类型的强制转换,这意味着它可以比较两个不同类型的对象,在执行比较之前它将会尝试把这两个对象转换成同一个类型,举一个例子:
"1" == 1 //true
然而,这样往往会误导我们,而且我们也不需要这样子来比较。在上面的例子中,我们完全可以先将字符串转换成数字型,然后利用对类型敏感的三重等号(===)来进行比较,如:
Number("1") === 1; //true
或者,更好的是,确保你放在首位的操作数的类型是正确的。
由于双等号具有强制类型转换的行为,所以它会打破一般的传递性规则,这点有点吓人,请看下面的列子:
"" == 0 //true - 空字符串会被强制转换为数字0. 0 == "0" //true - 数字0会被强制转换成字符串"0" "" == "0" //false - 两操作数都是字符串所以不执行强制转换
如果使用三重等号,上面的三个比较都将返回false。
parseInt不把10作为数字基数
如果你忽略parseInt的第二个参数,那么数字的基数将由下面的规则所决定:
一个常见的错误是我们让用户输入以0开头的数字,这时候它就按8进制的方式去解析了,于是我们就看到了如下的效果:
parseInt("8"); //8 parseInt("08"); //0
因此,我们很多时候都会指定parseInt的第二个参数,如下所示:
parseInt("8", 10); //8 parseInt("08", 10); //8
ECMAScript5方面的说明:ECMAScript已不再支持8进制的解析假设,另外,如果忽略parseInt的第二个参数将会引起JSLint的警告。
字符串替换
字符串替换函数仅仅会替换第一个匹配项,并不能替换你所期望的全部匹配项。如下代码:
"bob".replace("b", "x"); // "xob" "bob".replace(/b/, "x"); // "xob" (使用了正则表达式)
如果要替换所有的匹配项,我们可以使用正则表达式,并为他它添加全局修饰符,如下代码:
"bob".replace(/b/g, "x"); // "xox" "bob".replace(new RegExp("b", "g"), "x"); //