问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

js 代码运行效率上的问题。

发布网友 发布时间:2022-04-23 03:21

我来回答

5个回答

懂视网 时间:2022-04-23 07:42

这次给大家带来提高JS执行效率总结,提高JS执行效率的注意事项有哪些,下面就是实战案例,一起来看一下。

1.使用逻辑符号&&或者||进行条件判断

var foo = 10; 
foo == 10 && doSomething(); // 如果 foo == 10 则执行 doSomething(); 
foo == 5 || doSomething(); // 如果 foo != 5 则执行doSomething();

“||”也可以用来设置函数参数的默认值

Function doSomething(arg1){ 
 Arg1 = arg1 || 10; // 如果 arg1为设置那么 Arg1=10
}

2.使用map()方法来遍历数组

var squares = [1,2,3,4].map(function (val) { 
 return val * val; 
}); 
// 运行
结果为 [1, 4, 9, 16]

3.舍入小数位数

var num =2.443242342; 
num = num.toFixed(4); // 保留四位小数位 2.4432

4.浮点数问题

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

0.1+0.2等于0.30000000000000004,为什么会发生这种情况?根据IEEE754标准,你需要知道的是所有JavaScript数字在64位二进制内的都表示浮点数。开发者可以使用toFixed()和toPrecision()方法来解决这个问题。

5.使用for-in loop检查遍历对象属性

下面这段代码主要是为了避免遍历对象属性。

for (var name in object) { 
 if (object.hasOwnProperty(name)) { 
 // 执行代码
 } 
}

6.逗号操作符

var a = 0; 
var b = ( a++, 99 ); 
console.log(a); // a 为 1 
console.log(b); // b 为 99

7.计算或查询缓存变量

在使用jQuery选择器的情况下,开发者可以缓存DOM元素

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

8.在将参数传递到isFinite()之前进行验证

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

9.在数组中避免负向索引

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

确保参数传递到indexOf()方法里是非负向的。

10.(使用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 */

11.避免使用eval()或Function构造函数

eval()和Function构造函数被称为脚本引擎,每次执行它们的时候都必须把源码转换成可执行的代码,这是非常昂贵的操作。

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

12.避免使用with()方法

如果在全局区域里使用with()插入变量,那么,万一有一个变量名字和它名字一样,就很容易混淆和重写。

13.避免在数组里使用for-in loop

而不是这样用:

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++)

为什么?数组长度arraynNumbers在每次loop迭代时都会被重新计算。

14.不要向setTimeout()和setInterval()方法里传递字符串

如果在这两个方法里传递字符串,那么字符串会像eval那样重新计算,这样速度就会变慢,而不是这样使用:

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

相反,应该这样用:

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

15.使用switch/case语句代替较长的if/else语句

如果有超过2个以上的case,那么使用switch/case速度会快很多,而且代码看起来更加优雅。

16.遇到数值范围时,可以选用switch/casne

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); // 返回 "Baby"

17.创建一个对象,该对象的属性是一个给定的对象

可以编写一个这样的函数,创建一个对象,该对象属性是一个给定的对象,好比这样:

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

18.一个HTML escaper函数

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

19.在一个loop里避免使用try-catch-finally

try-catch-finally在当前范围里运行时会创建一个新的变量,在执行catch时,捕获异常对象会赋值给变量。
不要这样使用:

var object = ['foo', 'bar'], i; 
for (i = 0, len = object.length; i <len; i++) { 
 try { 
 // 执行代码,如果出错将被捕获
 } 
 catch (e) { 
 // 获取错误,并执行代码
 } 
}

应该这样使用:

var object = ['foo', 'bar'], i; 
try { 
 for (i = 0, len = object.length; i <len; i++) { 
 // 执行代码,如果出错将被捕获
 } 
} 
catch (e) { 
 // 获取错误,并执行代码
}

20.给XMLHttpRequests设置timeouts

如果一个XHR需要花费太长时间,你可以终止链接(例如网络问题),通过给XHR使用setTimeout()解决。

var xhr = new XMLHttpRequest (); 
xhr.onreadystatechange = function () { 
 if (this.readyState == 4) { 
 clearTimeout(timeout); 
 // 执行代码
 } 
} 
var timeout = setTimeout( function () { 
 xhr.abort(); // call error callback 
}, 60*1000 /* 设置1分钟后执行*/ ); 
xhr.open('GET', url, true); 
 
xhr.send();

此外,通常你应该完全避免同步Ajax调用。

21.处理WebSocket超时

一般来说,当创建一个WebSocket链接时,服务器可能在闲置30秒后链接超时,在闲置一段时间后,防火墙也可能会链接超时。

为了解决这种超时问题,你可以定期地向服务器发送空信息,在代码里添加两个函数:一个函数用来保持链接一直是活的,另一个用来取消链接是活的,使用这种方法,你将控制超时问题。

添加一个timeID……

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()方法放在onClose()方法下面。

22.记住,最原始的操作要比函数调用快

对于简单的任务,最好使用基本操作方式来实现,而不是使用函数调用实现。
例如

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

基本操作方式:

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

23.编码时注意代码的美观、可读

JavaScript是一门非常好的语言,尤其对于前端工程师来说,JavaScript执行效率也非常重要。

我们在编写JavaScript程序时注意一些小细节,掌握一些常用的实用小技巧往往会使程序更简捷,程序执行效率更高

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

JS中时间单位比较的方法

JS操作JSON详细介绍

热心网友 时间:2022-04-23 04:50

如果对于计算机来说都过多过复杂,那肯定会比较慢,但如果只是你自己认为多的话,那还是测试测试吧。在一台低配的机器上如果能跑得比较顺畅,那么这个JS还是不多,也不那么复杂的。JS可以为服务器分担负担,对于服务器来说,那是件好事,整体的效率不见得一定会变低

热心网友 时间:2022-04-23 06:08

会占用客户端的资源的,导致部分浏览器死掉的。你可以打开任务管理器,看CPU的动向,查看JS对CPU的影响。

热心网友 时间:2022-04-23 07:43

现在的机器配置,基本上是感觉不到效率问题的。JS复杂没有关系的。

热心网友 时间:2022-04-23 09:34

js在客户端运行,只要访问网站的客户端机器没问题就行
目前来说,现在每个人的PC机都是没问题的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
炒股怎么买进卖出? 办一个餐饮的营业执照要多少钱 上海贷款平台有哪些 上海有什么网贷 Intel 赛扬D325 2.53G与多大频率的内存匹配 Intel 赛扬D 352(散)重要参数 CPU Intel 赛扬D 326 这个东西怎么看的? Intel 赛扬D 326(散)重要参数 Intel 赛扬D 325(盒)重要参数 Intel 赛扬D 325(盒)Intel 赛扬D 325(盒)详细参数 我今年1984年7月出生。今年9月23日的预产期。请问生男生女? 苹果邮箱怎样找回 给QQ里的好友空间点了赞没有评论,为什么会像微信那样收到别的共同好友也赞他的通知啊,怎么取消呢? QQ空间点过赞之后,一刷新就消失了,求教各路大神怎么破?急!!! 深圳事业单位考试考什么?考几门?有主观题吗? 深圳事业单位联考的一般类岗位考的内容是事业单位A类还是B类。 深圳事业单位联考的题型有哪些? 如何选择公司呢 怎么选择好企业 要从哪几个方面理解 如何选择好企业 企业该如何选择类型,要怎么操作、 什么是企业选择 如何选适合自己的企业 什么是企业选择? 请问车损险赔对方吗 (股票)为什么逢缺必补呢?请专业炒手回答 期货里的抄手是啥意思? 股票里的抄手是什么意思 怎么把微信中的黑名单全部删除掉 有一个动画片里有一些大机器人 还有个女驾驶员叫零 那个动画片叫什么 末次月经9月30号预产期是什么时候 股票比基金风险大、收益大的原因是什么?收益多少? 收益较大和损失较大的股票统计盈亏情况 超出预产期生男还是生女的多 怎么看怀的男孩还是女孩 10月预产期生男多还是女多 9月6号末次月经预产期什么时候 东阿阿胶块浸泡后出现泡沫,都泡了快一天了,这样是不是说明有问题? 阿胶熬出来颜色浅,气泡多怎么回事 商品动态图采用的工具软件是 有没有问题?阿胶用黄酒浸泡后出现泡沫? 熬好的阿胶化了起泡泡了还能吃吗 黄酒泡的阿胶第二天上面漂了一层沫沫,怎么回事? 有什么工具可以截取动态图啊(截了之后可做成签的那种) 请教下,想做阿胶糕,先用黄酒泡阿胶三天后有白色的漂浮物,是怎么回事,这样正常吗?是不是坏了?谢谢大 阿胶糕泡水里有气泡怎么回事 阿胶和黄酒一起蒸后上面有一层白色 吃了阿胶糕,口腔里长了很多泡,是阿胶糕引起的吗 手机怎么改新浪微博安全邮箱 我想问一下支付宝里的20000元转到银行卡以后借了支付宝的钱怎样归还