1. 区分大小写:变量名、属性和方法全部都区分大小写
2. 不匹配的引号、圆括号或花括号将抛出错误
3. 条件语句:3个常见陷阱
4. 换行:一直用分号结束语句来避免常见的换行问题
5. 标点法:在对象声明的尾部逗号将导致出错
6. HTML id 冲突
7. 变量作用域:全局变量对局部变量
8. 函数重载:当重载不存在时,覆盖函数
9. 区分string.replace()函数不是全局的
10. parseInt应该包含两个参数
11. “this”和绑定问题
12. 为参数设置默认值,以免你遗漏它们
13. for each循环是用于对象而不是数组
14. switch语句需要点技巧
15. 总是在检查undefined前检查null
16. 时间处理陷阱
区分大小写
变量名和函数名都是区分大小写的。就像配错的引号一样,这些大家都知道。但是,由于错误是不作声的,所以这是一个提醒。为自己选择一个命名规则,并坚持它。而且,记住JavaScript中的原生函数和CSS属性都是 骆驼拼写法(camelCase)。
getElementById(’myId’) != getElementByID(’myId’); //它应该是“Id”而不是“ID”
getElementById(’myId‘) != getElementById(’myID‘); // “Id”也不等于“ID”
document.getElementById('myId').style.Color; //返回 "undefined"
不匹配的引号、圆括号或花括号
避免陷入不匹配的引号、圆括号或花括号陷阱的最好方式是编码时一直同时写出打开和关闭这两个元素符号,然后在其中间加入代码。开始:
var myString = ""; //在输入字符串值之前写入这对引号
function myFunction(){
if(){//关闭每个打开的括弧
}
}
//统计所有的左括号和右括号数量,并且确保它们相等
alert(parseInt(var1)*(parseInt(var2)+parseInt(var3))); //关闭每个打开的圆括号
每当你打开一个元素,请关闭它。当你添加了关闭圆括号后,你再把函数的参数放进圆括号中。如果有一串圆括号,统计所有打开的圆括号和所有关闭的圆括号,并且确保这两个数字相等。
条件语句(3个陷阱)
1. 所有的条件语句都必须位于圆括号中。
if(var1 == var2){}
2. 不要犯无意地使用赋值运算符的错误:把第二个参数的值赋给第一个参数。因为它是一个逻辑问题,它将一直返回true且不会报错。
if(var1 = var2){} // 返回true。把var2赋值给var1
3. JavaScript是弱类型,除了在 switch语句 中。当JavaScript在case比较时,它是非弱类型。
var myVar = 5;
if(myVar == '5'){ //返回true,因为JavaScript是弱类型
alert("hi"); //这个alert将执行,因为JavaScript通常不在意数据类型
}
switch(myVar){
case '5':
alert("hi"); //这个alert将不会执行,因为数据类型不匹配
}
换行
当心JavaScript中的硬换行。换行被解释为表示行结束的分号。即使在字符串中,如果在引号中包括了一个硬换行,那么你会得到一个解析错误(未结束的字符串)。
var bad = '<ul id="myId">
<li>some text</li>
<li>more text</li>
</ul>'; // 未结束的字符串错误
var good = '<ul id="myId">' +
‘<li>some text</li>‘ +
‘<li>more text</li>‘ +
‘</ul>’; // 正确
前面讨论过的换行被解释为分号的规则并不适用于控制结构这种情况:条件语句关闭圆括号后的换行并不是给其一个分号。
一直使用分号和圆括号,那么你不会因换行而出错,你的代码易于阅读,且除了那些不使用分号的怪异源码外你会少一些顾虑:所以当移动代码且最终导致两个语句在一行时,你无需担心第一个语句是否正确结束。
多余的逗号
在任何JavaScript对象定义中,最后一个属性决不能以一个逗号结尾。Firefox不会出错,而IE会报语法错误。
var theObj = {
city : "Boston",
state : "MA",//IE6和IE7中有“缺少标识符、字符串或数字”的错误,IE8 beta2修正了它
}
HTML id 冲突
JavaScript DOM绑定(JavaScript DOM bindings)允许通过HTML id索引。在JavaScript中函数和属性共享同一个名字空间。所以,当在HTML中的一个id和函数或属性有相同的名字时,你会得到难以跟踪的逻辑错误。然而这更多是一个 CSS最佳实践 的问题,当你不能解决你的JavaScript问题时,想起它是很重要的。
<ul>
<li id="length">1</li>
<li id="thisLength">2</li>
<li id="thatLength">3</li>
</ul>
<script>
var listitems = document.getElementsByTagName('li');
var liCount = listitems.length; //IE下返回的是<li id="length">1</li>这个节点而不是所有<li>的数量
var thisLength = document.getElementById('thisLength');
thatLength = document.getElementById('thatLength');
//IE下会出现“对象不支持此属性和方法”的错误,IE8 beta2下首次加载页面会出错,刷新页面则不会
//在IE中thisLength和thatLength直接表示以其为id值的DOM节点,
//所以赋值时会出错,当有var声明时,IE会把其当着变量,这个时候就正常了。
</script>
如果你要标记(X)HTML,绝不要使用JavaScript方法或属性名作为id的值。并且,当你写JavaScript时,避免使用 (X)HTML中的id值作为变量名。
变量作用域