Js开发中常用的技巧

1、首次为变量赋值时务必使用var关键字

变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量。很显然,全局变量的搜索要比局部变量慢得多;这样就是很多像jQueryjs类库,将window作为入参传入的原因之一。

 

2、使用===取代==

==!=操作符会在需要的情况下自动转换数据类型。但===!==不会,它们会同时比较值和数据类型,这也使得它们要比==!=快。(两个之间的区别,详见博主的博客)。

 

3underfinednull0falseNaN、空字符串的逻辑结果均为false

这个在博客javascript语言中的毒瘤()有关于js中常见“假值”的介绍。

 

4、行尾使用分号

实践中最好还是使用分号,忘了写也没事,大部分情况下JavaScript解释器都会自动添加。对于为何要使用分号,也是很多大牛们讨论的热点。知乎上也有这个讨论,如想了解,猛戳这里

5、使用自调用函数

函数在创建之后直接自动执行,通常称之为自调用匿名函数(Self-Invoked Anonymous Function)或直接调用函数表达式(Immediately Invoked Function Expression )。这个的好处,就是你防止全局污染,以及模块化和封装;很多组件,类库建议采用这种方式

 

6、用JSON来序列化与反序列化

var person = {name:'Saad', age : 26, department : {ID : 15, name : "R&D"} };
var stringFromPerson = JSON.stringify(person);
var personFromString = JSON.parse(stringFromPerson);

7、不要使用eval()或者函数构造器

eval()和函数构造器(Function consturctor)的开销较大,每次调用,JavaScript引擎都要将源代码转换为可执行的代码。

var func1 = new Function(functionCode);
var func2 = eval(functionCode);

 

8、避免使用with()

使用with()可以把变量加入到全局作用域中(延长变量的作用域),因此,如果有其它的同名变量,一来容易混淆,二来值也会被覆盖。

 

9、传给setInterval()setTimeout()时使用函数而不是字符串

如果传给setTimeout()setInterval()一个字符串,他们将会用类似于eval方式进行转换,这肯定会要慢些,因此不要使用:

setInterval('doSomethingPeriodically()', 1000);  
setTimeout('doSomethingAfterFiveSeconds()', 5000);

而是用:

setInterval(doSomethingPeriodically, 1000);  
setTimeout(doSomethingAfterFiveSeconds, 5000);


 

10、使用switch/case代替一大叠的if/else

当判断有超过两个分支的时候使用switch/case要更快一些,而且也更优雅,更利于代码的组织,当然,如果有超过10个分支,就不要使用switch/case了。

 

11、在switch/case中使用数字区间
其实,switch/case中的case条件,还可以这样写:

function getCategory(age) {  
    var category = "";  
    switch (true) {  
        case isNaN(age):  
            category = "not anage";  
            break;  
        case (age >= 50):  
            category ="Old";  
            break;  
        case (age <= 20):  
            category ="Baby";  
            break;  
        default:  
            category ="Young";  
            break;  
    };  
    return category;  
}  
getCategory(5);  // 
将返回
"Baby"

 

12、使用对象作为对象的原型

下面这样,便可以给定对象作为参数,来创建以此为原型的新对象:

function clone(object) {  
    function OneShotConstructor(){};
 
    OneShotConstructor.prototype = object;  
    return new OneShotConstructor();
 
}
 
clone(Array).prototype ;  // []

 

13HTML字段转换函数

function escapeHTML(text) {  
    var replacements= {"<": "<",">": ">","&": "&","\"": """};                    
 
    return text.replace(/[<>&"]/g, function(character){  
        returnreplacements[character];  
    });
 
}

 

14、不要在循环内部使用try-catch-finally

try-catch-finallycatch部分在执行时会将异常赋给一个变量,这个变量会被构建成一个运行时作用域内的新的变量。
切忌:

var object = ['foo', 'bar'], i;  
for (i = 0, len = object.length; i <len; i++) {  
    try {  
        // do something that throws an exception
 
    }  
    catch (e) {   
        // handle exception  
    }
 
}

而应该:

var object = ['foo', 'bar'], i;  
try {
 
    for (i = 0, len = object.length; i <len; i++) {  
        // do something that throws an exception
 
    }
 
}
 
catch (e) {   
    // handle exception  
}


15、使用XMLHttpRequests时注意设置超时

XMLHttpRequests在执行时,当长时间没有响应(如出现网络问题等)时,应该中止掉连接,可以通过setTimeout()来完成这个工作:
v

ar xhr = new XMLHttpRequest ();
 
xhr.onreadystatechange = function () {  
    if (this.readyState == 4) {  
        clearTimeout(timeout);  
        // do something with response data
 
    }  
}  
var timeout = setTimeout( function () {  
    xhr.abort(); // call error callback  
}, 60*1000 /* timeout after a minute */ );
 
xhr.open('GET', url, true);  
xhr.send();

同时需要注意的是,不要同时发起多个XMLHttpRequests请求。

 

16、处理WebSocket的超时

通常情况下,WebSocket连接创建后,如果30秒内没有任何活动,服务器端会对连接进行超时处理,防火墙也可以对单位周期没有活动的连接进行超时处理。

为了防止这种情况的发生,可以每隔一定时间,往服务器发送一条空的消息。可以通过下面这两个函数来实现这个需求,一个用于使连接保持活动状态,另一个专门用于结束这个状态。
v

ar timerID = 0; 
function keepAlive() { 
    var timeout = 15000;  
    if (webSocket.readyState == webSocket.OPEN) {  
        webSocket.send('');  
    }  
    timerId = setTimeout(keepAlive, timeout);  
}  
function cancelKeepAlive() {  
    if (timerId) {  
        cancelTimeout(timerId);  
    }  
}

keepAlive()函数可以放在WebSocket连接的onOpen()方法的最后面,cancelKeepAlive()放在onClose()方法的最末尾。

 

17、时间注意原始操作符比函数调用快,使用VanillaJS

比如,一般不要这样:

var min = Math.min(a,b);
 
A.push(v);

可以这样来代替:

var min = a < b ? a : b;
 
A[A.length] = v;

 

18、开发时注意代码结构,上线前检查并压缩JavaScript代码

别忘了在写代码时使用一个代码美化工具。使用JSLint(一个语法检查工具)并且在上线前压缩代码(比如使用JSMin)。注:现在代码压缩一般推荐 UglifyJS (https://github.com/mishoo/UglifyJS2)

未完待续。。。。。