您的位置:首页 > Web前端 > JavaScript

【笔记】改善javascript程序的188个建议27-33

2015-04-16 13:59 573 查看
27、小心if隐藏的BUG

(1)if(a = 1){...}

把比较运算符错写为赋值运算符。

为了防止出现这样低级令人讨厌的错误,建议在条件表达式的比较运算中,把常量写在左侧,把变量写在右侧。这样在你写错的时候,会报错。

if( 1 == a){ ... }

(2)在if之后添加了分号(;)

if(a==1);{

...

}

28、使用查表法提高条件检测的性能

当有大量离散值需要测试时,使用if和switch都比使用查表法要慢得多。

比如:

switch(value):
		case 0 :
			return result0;
		case 1 : 
			return result1;
		case 2 : 
			return result2;
		case 3 : 
			return result3;
		case 4 : 
			return result4;
		case 5 : 
			return result5;
		case 6 : 
			return result6;
		case 7 : 
			return result7;
		case 8 : 
			return result8;
		case 9 : 
			return result9;
		default : 
			return result10;
	}


改为:

var results = [result0,result1,result2,result3,result4,result5,result6,result7,result8,result9,result10];
	return results[value];


使用查表法时,必须完全消除所有条件判断。操作转换成一个数组项查询或一个对象成员查询。使用查表法的一个主要优点:由于没有条件判断,当候选值数量增加时,基本上不会增加额外的性能开销。

29、准确使用循环体

在js提供的四种循环类型中,只有for in循环执行速度比其他循环明显要慢。

除非需要对数目不详的对象属性进行操作,否则避免使用for in循环。

30、使用递归模式

递归函数会受到浏览器调用栈大小的限制。

当使用了太多的递归,超过最大调用栈尺寸时,浏览器会弹出错误信息。

try{
		recurse();
	}catch(ex){
		alert('error info');
	}


当出现调用栈尺寸限制的问题时,第一步定位在代码中的递归实例上。

两种递归方式:

(1)直接递归:

function r(){
		r();
	}
	r();


(2)精巧模式:

function a(){
		b();
	}
	function b(){
		a();
	}


a();

常见的栈溢出原因是一个不正确的终止条件。如果条件是正确的,那么算法包含了太多层递归,为了能够安全滴在浏览器中运行,应改用迭代、制表或混合模式。

31、使用迭代

使用迭代代替递归,速度会慢点,但是可以避免栈溢出错误。

32、使用制表(记忆递归)

比如,阶乘可以改为:

function menfactorial(n){
		if(!memfactorial.cache){
			memfactorial.cache = {
				'0':1,
				'1':1
			};
		}
		if(!menfactorial.cache.hasOwnProperty(n)){
			memfactorial.cache
 = n*memfactorial(n-1);
		}
		return memfactorial.cache
;
	}


使用制表法设计阶乘函数的关键是简历一个缓存对象,此对象位于函数内部,其中预制了两个最简单的阶乘,在计算阶乘之前,先检查缓存中是否已经存在相应的计算结果。没有对应的缓冲值说明这是第一次计算此数值的阶乘,计算完成之后,结果存入缓存中,供以后使用。

33、优化循环结构

(1)优化结构

(2)避免不必要的重复操作

不需要变化的东西,比如数组的声明等,可以放在循环体外,不用每次都声明。

(3)妥善定义循环变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: