一、javascript中避免起首的大括号换行的风格
<var log = function ()</span><br />
{
cosole.log("do not code with this style");
}应当使用起首大括号不换号的风格
<pre name="code" class="javascript">var log = function(){console.log("code with this style");
}
因为javascript解析器会将换行默认为是语句的结束,因此若采用起首大括号换行的编码风格的话,可能会导致javascript代码在执行的时候产生与预期行为不一致的现象。考虑一下代码
<pre name="code" class="javascript">var log = function(){return {suggestion : "do not code with this style"}
}console.log(log());
控制台会输出什么值?答案是undefined。为什么呢?因为javascript解析器将换号编译成了语句的结束,即相当于在return后面加了个;所以返回的值自然是undefined。如果修改成如下代码则能正确的返回一个还有suggestion成员属性的对象了。
var log = function(){return{suggestion:"do not code with this style"}}console.log(log());
二、在你js文件的开头加上;,因为不能确定浏览器再加载你js代码的时候是换行插入到其他js代码的后面还是不换行就插入,如果不换行就插入的话,很可能造成js执行的时候报错。
三、闭包容易导致内存泄露。所谓闭包指的是一个函数内部的引用期局部变量的一个内部函数,实现方式如下:
var closure = function() {var local = "this is closure show" ;return function() {console.log(local);};
};
closure ();很显然,控制台会输出"this is closure show"。但是由于函数运行完以后,依然引用了该局部变量,所以内存回收的时候不会回收该局部变量,若该类变量持续增加的话,容易导致内存溢出。
四、在函数开头申明所有的局部变量。否则,容易由于和全局变量的冲突导致对变量引用的失败,看如下代码:
var global = "another suggestion" ;
var error = function() {console.log(global);var global = "actually,this is a local variable";console.log(global);
};
error();事实上,运行这段代码,输出的值是“undefined”和“actually,this is a local variable”。为什么呢?其实在javascript解释器解释javascript代码时会将变量提前声明,因此在error函数中global变量会在第一次console.log(global)运行前被重新声明为局部变量,在原来声明为局部变量的位置再重新给global变量赋值,解析成类似代码如下:
var global = "another suggestion" ;
var error = function() {var global ;console.log(global);global = "actually,this is a local variable";console.log(global);
};
error();
所以第一次运行console.log(global)时,输出的结果是undefined。
五、javascript解析的for循环优化比while循环优化做的好,推荐多使用for循环;另,for in循环实现的不好,因为每次循环执行时需要遍历所有变量包括从原型链继承来的,因此在遍历由多继承来的对象的时候,效率极低 。
六、javascript的自动类型装换方向是向基本数据类型转,且当字符串类型向数值型类型转换失败时返回NaN,NaN与任何数值型数据比较都返回false;如以下代码:
console.log("haha" == 1) ;
六、由于JavaScript是通过二进制浮点数的形式来表示实数的,因此不能够精确的表示十进制分数,比如1/10、1/100等。因此在数值比较中会存在一些问题,如下代码所示:
var x = .3 - .2 ; //运算后的结果是0.09999999999999998
var y = 0.2 - 0.1 ;//运算后的结果是0.1
x == y ; //运行结果为false因此在JavaScirpt的数值比较运算中,尽量使用二进制的分数运算,不要使用10进制的分数进行运算。