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. PyQt5(3)——信号和槽初探

    信号和槽是QT的核心机制(当信号发射时,链接的槽函数会自动执行) 在pyqt5中信号和槽通过 QObject.signal.connect()链接. QObject类或子类(QWidget)派生的类都 ...

  2. 深度学习(tensorflow) —— 自己数据集读取opencv

    先来看一下我们的目录: dataset1 和creat_dataset.py 属于同一目录 mergeImg1 和mergeImg2 为Dataset1的两子目录(两类为例子)目录中存储图像等文件 核 ...

  3. python全栈开发_day12_装饰器

    一:装饰器 1)什么是装饰器 装饰器的本质就是利用闭包,在满足开放(修改函数锁包含的功能)封闭(不改变源代码)的情况下完成操作. 2)装饰器的基本运用 def name_judge(f): def a ...

  4. 洛谷 P4248 / loj 2377 [AHOI2013] 差异 题解【后缀自动机】【树形DP】

    可能是一个 SAM 常用技巧?感觉 SAM 的基础题好多啊.. 题目描述 给定一个长度为 \(n\) 的字符串 \(S\) ,令 \(T_i\) 表示它从第 \(i\) 个字符开始的后缀,求: \[ ...

  5. [转] 在Jenkins Pipeline DSL中 遍历 groovy list

    [From] https://stackoverflow.com/questions/36360097/iterating-a-groovy-list-in-jenkins-pipeline-dsl ...

  6. 在MonoGame中SetRenderTarget会把后备缓冲区清除的解决方法

    在MonoGame中SetRenderTarget会把后备缓冲区清除的解决方法: 在构造函数中添加事件:graphics.PreparingDeviceSettings += Graphics_Pre ...

  7. MM 后台配置(转)

    本文转自:https://www.cnblogs.com/yanglikun/p/4124797.html 一.全局配置 1.一般配置 SPRO->SAP NETWEAVER -> GEN ...

  8. jquery加载单文件vue组件

    /**注册组件 */ function registerComponent(name){ dm[name] = {}; Vue.component(name + '-component', funct ...

  9. js定时器执行

    第一种:问题请求代表执行打印出来的是什么? //定时器执行页面崩溃 var bo = true; setTimeout(function () { console.log("定时器执行&qu ...

  10. android 企业级高性能图表库 SciChart (付费)

    1.官网 https://www.scichart.com/ 2.特性 2.1 链接 https://www.scichart.com/android-chart-features/ https:// ...