1. 避免生成隐式全局变量:
下面的片段中,a
是本地变量但是b
确实全局变量,这可能不是你希望发生的:
// 反例,勿使用 function foo() { var a = b = 0; // ...}
此现象发生的原因在于这个从右到左的赋值,首先,是赋值表达式b = 0
,此情况下b是未声明的。这个表达式的返回值是0,然后这个0就分配给了通过var定义的这个局部变量a。
换句话说,就好比你输入了:
var a = (b = 0);
2. for-in
循环应该用在非数组对象的遍历上:
(1) 从技术上将,你可以使用for-in
循环数组,但这是不推荐的。因为如果数组对象已被自定义的功能增强,就可能发生逻辑错误。
另外,在for-in中,属性列表的顺序(序列)是不能保证的。
所以最好数组使用正常的for循环,对象使用for-in循环。
(2) 有个很重要的hasOwnProperty()
方法,当遍历对象属性的时候可以过滤掉从原型链上继承下来的属性和方法:
// 对象var man = { hands: 2, legs: 2, heads: 1};// 一个方法添加给了所有对象if (typeof Object.prototype.clone === "undefined") { Object.prototype.clone = function () {};}// 1.// for-in 循环for (var i in man) { if (man.hasOwnProperty(i)) { // 过滤 console.log(i, ":", man[i]); }}/* 控制台显示结果hands : 2legs : 2heads : 1*/// 2.// 反面例子:// for-in loop without checking hasOwnProperty()for (var i in man) { console.log(i, ":", man[i]);}/*控制台显示结果hands : 2legs : 2heads : 1clone: function()*/
3. parseInt()下的数值转换:
使用parseInt()你可以从字符串中获取数值,当字符串以”0″开头的时候就有可能会出问 题,开头为”0″的字符串被当做8进制处理了,为了避免矛盾和意外的结果,应该总是指定基数参数。
var month = "06", year = "09";month = parseInt(month, 10);year = parseInt(year, 10);
如果你忽略了基数参数,如parseInt(year),返回的值将是0,因为“09”被当做8进制(好比执行 parseInt( year, 8 )),而09在8进制中不是个有效数字。
替换方法是将字符串转换成数字:
+"08" // 结果是 8Number("08") // 8
4. 函数声明在条件语句内:
函数声明在条件语句内虽然可以用,但是没有被标准化,也就是说不同的环境可能有不同的执行结果,所以这样情况下,最好使用函数表达式:
// 千万别这样做! // 因为有的浏览器会返回first的这个function,而有的浏览器返回的却是第二个 if (true) { function foo() { return 'first'; } } else { function foo() { return 'second'; } } foo(); // 相反,这样情况,我们要用函数表达式 var foo; if (true) { foo = function() { //典型的赋值表达式 return 'first'; }; } else { foo = function() { return 'second'; }; } foo();