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. ajax 常用格式

    $.ajax({ url: "/", //请求路径 type: "post",//请求方式 data: "json", //发送请求的数据格 ...

  2. c++primer plus笔记

    > 第六版 操作符重载 #include<iostream> using namespace std; class Time { public: Time() { h=m=0; } ...

  3. 128th LeetCode Weekly Contest Capacity To Ship Packages Within D Days

    A conveyor belt has packages that must be shipped from one port to another within D days. The i-th p ...

  4. docker升级

    使用系统自带的docker源安装docker,安装的版本都是偏低的,因此需要进行版本升级 升级步骤如下: 1. 查找现主机上关于docker的已安装包, 若列出为空,跳过第2步 rpm -qa|gre ...

  5. Jmeter调试脚本之断言

    前言: jmeter中有个元件叫做断言(Assertion),它的作用和loadrunner中的检查点类似: 用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中的数据交互与预期一致. ...

  6. selenium+Python(Js处理浏览器滚动条)

    控制浏览器滚动条 有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助 js 是来进行操作.一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户是否阅读 ...

  7. nginx自动部署脚本

    需要下载脚本中需要的jar包nginx.pcre和zlib,自己也上传了一个自己部署的包 https://download.csdn.net/download/qq_17842663/10822976 ...

  8. 九度oj题目1019:简单计算器

    题目1019:简单计算器 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6346 解决:2334 题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达 ...

  9. Sed - An Introduction and Tutorial by Bruce Barnett

    http://www.grymoire.com/unix/sed.html Quick Links - NEW Sed Commands : label # comment {....} Block ...

  10. vue加载Element ui地址省市区插件-- element-china-area-data

    1.安装 npm install element-china-area-data -S 2.使用(引入) import { provinceAndCityData, regionData, provi ...