21. 使用逻辑AND/OR来处理条件语句

    var foo =10;
foo ==10&& doSomething();// is the same thing as if (foo == 10) doSomething();
foo ==5|| doSomething();// is the same thing as if (foo != 5) doSomething(); 逻辑AND也可以用来设置含糊参数缺省的值 Function doSomething(arg1){
Arg1= arg1 ||10;// arg1 will have 10 as a default value if it’s not already set
}

22. 使用map()函数方法来循环数组里的项目

    var squares =[1,2,3,4].map(function(val){
return val * val;
});
// squares will be equal to [1, 4, 9, 16]

23. 按小数点后N位来四舍五入

    var num =2.443242342;
num = num.toFixed(4);// num will be equal to 2.4432

24. 浮点问题

    0.1+0.2===0.3// is false
9007199254740992+1// is equal to 9007199254740992
9007199254740992+2// is equal to 9007199254740994

为什么? 0.1 + 0.2 等于 0.30000000000000004 。你应该知道所有的javascript数字在64位2进制内部都是使用浮点表示

这个来自于IEEE 754标准。更多信息介绍,请参考:相关博客

你可以使用上面介绍的toFixed()和toPrecision()来解决这个问题

25. 使用for-in循环来检查对象的指定属性

下面的代码片段非常实用,可以避免从对象的prototype来循环遍历对象的属性:

    for(var name inobject){
if(object.hasOwnProperty(name)){
// do something with name
}
}

26. 逗号操作符

    var a =0;
var b =( a++,99);
console.log(a);// a will be equal to 1
console.log(b);// b is equal to 99

27. 缓存需要计算或者DOM查询的变量

使用jQuery的选择器,我们一定要记住缓存DOM元素,这样会提高执行效率:

    var navright = document.querySelector('#right');
var navleft = document.querySelector('#left');
var navup = document.querySelector('#up');
var navdown = document.querySelector('#down');

28. 在传入isFinite()之前验证参数

    isFinite(0/0);// false
isFinite("foo");// false
isFinite("10");// true
isFinite(10);// true
isFinite(undifined);// false
isFinite();// false
isFinite(null);// true !!!

29. 避免数组中index为负值

    var numbersArray =[1,2,3,4,5];
varfrom= numbersArray.indexOf("foo");// from is equal to -1
numbersArray.splice(from,2);// will return [5]

这里需要注意indexof的参数 不能为负值,但是splice可以

30. 序列化和反序列化(用来处理JSON)

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

31. 避免使用eval或者Function构建器

使用eval或者function构建器是一件非常消耗资源的操作,因为每次调用script引擎都必须将源代码转换为可执行的代码

    var func1 =newFunction(functionCode);//避免使用!!
var func2 =eval(functionCode);//避免使用!!

32. 避免使用with()

使用with()可以用来插入一个变量到全局。然而,如果另外一个变量拥有同样的名字,将会导致非常混乱并且会覆盖数值

33. 避免在数组中使用for-in循环

不推荐使用:

    var sum =0;
for(var i in arrayNumbers){
sum += arrayNumbers[i];
}

如下代码将会更好:

    var sum =0;
for(var i =0, len = arrayNumbers.length; i < len; i++){
sum += arrayNumbers[i];
}

作为额外的好处,i和len的实例化都执行一次,因为都是循环中的第一个语句,但是比下面执行速度更快:

    for(var i =0; i < arrayNumbers.length; i++)

为什么? arrayNumbers的长度在每次循环都计算一次

34. 传递函数,而非字符串到setTimeout()和setInterval()中

如果你传递一个字符串到setTimeout和setInterval中,处理方式和eval将会类似,速度会很慢,不要使用如下:

    setInterval('doSomethingPeriodically()',1000);
setTimeOut('doSomethingAfterFiveSeconds()',5000); 推荐使用如下 setInterval(doSomethingPeriodically,1000);
setTimeOut(doSomethingAfterFiveSeconds,5000);

35. 使用switch/case语句而非一系列的if/else

如果多余两个条件,使用switch/case将会更快,而且语法更优雅(代码组织的更好)。对于多余10个条件的避免使用。

36. 使用switch/case语句处理数值区域

使用如下小技巧处理数值区域:

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

37. 创建一个prototype是指定对象的对象

使用如下代码可以生成一个prototype是指定对象的对象:

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

39. 一个HTMLescaper方法

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

编译:当然,前台处理并不安全,后台处理更彻底

40. 在循环中避免使用try-catch-finally

不要使用如下代码:

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

使用这段代码:

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

40. 设置XMLHttpRequests的timeout

如果一个XHR花费了太多时间,你可以在XHR调用中使用setTimeout来退出连接:

    var xhr =newXMLHttpRequest();
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();

额外的好处,你可以完全避免同步AJAX调用

41. 处理WebSocket timeout

一般来说,当一个websocket连接建立后,服务器可以在30秒无响应的情况下time out你的连接。防火墙也可以做到。

为了处理timeout问题,你可以定时发送一个空的消息到服务器。为了实现,你可以添加两个方法到你的代码中:

一个保证连接的存在,另外一个取消连接。使用这个技巧,你可以处理timeout问题:

    var 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添加到webSocket的onClose函数最后。

42. 记住,操作符比函数调用更快

不推荐使用:

    var min =Math.min(a,b);
A.push(v); 推荐使用: var min = a < b ? a:b;
A[A.length]= v;

43. 不要忘记使用代码美化工具。在代码产品化前使用JSLint和代码压缩工具(例如,JSMin)来处理

20个实用javascript技巧及实践(二)的更多相关文章

  1. 20个实用的javascript技巧及实践(一)

    在本篇文章中,我们将会向大家分享JavaScript开发中的小技巧.最佳实践和实用内容,不管你是前端开发者还是服务端开发者,都应该来看看这些编程的技巧总结,绝对会让你受益匪浅的. 文中所提供的代码片段 ...

  2. 7.python3实用编程技巧进阶(二)

    2.1.如何拆分含有多种分隔符的字符串 #2.1.如何拆分含有多种分隔符的字符串 s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' #第一种方法 def my__ ...

  3. 【转】45个实用的JavaScript技巧、窍门和最佳实践

    原文:https://colobu.com/2014/09/23/45-Useful-JavaScript-Tips,-Tricks-and-Best-Practices/ 目录 [−] 列表 第一次 ...

  4. 实用Javascript调试技巧

    摘要: 高效调试JS代码. 原文:实用Javascript调试技巧分享 作者:MudOnTire Fundebug经授权转载,版权归原作者所有. 见过太多同学调试Javascript只会用简单的con ...

  5. 原生JavaScript技巧大收集(11~20)-(终于又被我找到这篇文章了)

    11.原生JavaScript加入收藏夹 function AddFavorite(sURL, sTitle) { try { window.external.addFavorite(sURL, sT ...

  6. (译文)12个简单(但强大)的JavaScript技巧(二)

    原文链接: 12 Simple (Yet Powerful) JavaScript Tips 其他链接: (译文)12个简单(但强大)的JavaScript技巧(一) 强大的立即调用函数表达式 (什么 ...

  7. ES6 Javascript 实用开发技巧

    ES6 实用开发技巧 定义变量/常量 ES6 中新增加了 let 和 const 两个命令,let 用于定义变量,const 用于定义常量 两个命令与原有的 var 命令所不同的地方在于,let, c ...

  8. ASP.NET MVC5 网站开发实践(二) Member区域–管理列表、回复及删除

    本来想接着上次把这篇写完的,没想到后来工作的一些事落下了,放假了赶紧补上. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目框架 ASP ...

  9. ASP.NET MVC5 网站开发实践(二) Member区域–我的咨询列表及添加咨询

    上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NE ...

随机推荐

  1. Linux rsync 企业级应用

    简介 rsync 是 Linux 下的数据同步工具, 其支持本地同步和远程同步, 远程同步分为 daemon 和 ssh 同步方式    rsync 可以代替 cp, scp 等命令, 且具有更高的可 ...

  2. 简单的XMPP服务器与客户端交互

    由客户端发起 C: <stream:stream to="localhost" xmlns="jabber:client" xmlns:stream=&q ...

  3. eclipse项目目录展示结构设置

    我因为前后端都搞过, 解除过很多的开发IDE,说真的,很多的项目目录结构都是一级一级分开,然后我可以通过展开等操作来查看文件等资源信息,结果呢?java的开发IDE eclipse默认的项目目录展示简 ...

  4. Windows下安装Redis服务(zip)

    1.官方没有 Windows版本的 Redis,官网介绍: Redis项目不正式支持Windows.但是,微软开发并维护了针对Win64的Windows版本. 2.Windows版本下载地址:http ...

  5. [CH3803] 扑克牌 (期望DP+记忆化搜索)

    [题目链接] [CH3803] 扑克牌 [题面描述] \(54\)张牌,每次随机摸一张,求得到 A张黑桃 B张红桃 C张梅花 D张方块 的期望步数.特别地,大王和小王可以当做任意一种花色,当然,会选择 ...

  6. [BZOJ 5158][Tjoi2014]Alice and Bob

    传送门 \(\color{green}{solution}\) 贪心 /************************************************************** P ...

  7. 更改Android编译软件版本(make/gcc/bision)

    一.make版本 1.下载make的压缩包 ftp://ftp.gnu.org/gnu/make/ 2.解压,安装 cd make-x.x ./configuration sh build.sh su ...

  8. Vue axios 上传图片

    上传图片接口 // 上传图片 export const uploadBanner = formData => { return axios.request({ url: 'manage/slid ...

  9. web网站优化

    没事儿研究一下YAHOO工程师对网站优化给出的策略,对重点部分在这儿做下笔记 -----------------------------------------------我是分割线--------- ...

  10. 那些H5用到的技术(1)——素材加载

    编码环境前言什么时候用到素材加载?loading提示,让用户等待图片的加载音频的加载利用神器PreloadJS总结 编码环境 Sublime Text 3 插件包括: Autoprefixer 自动补 ...