JavaScript性能优化(一)

本文聚焦JavaScript性能优化。因它最初是解释型语言,执行慢,如今主流浏览器实现编译执行。还介绍了优化作用域的方法,如避免全局查找、不必要的属性查找,以及优化循环,包括减值迭代和简化终止条件等,以提高代码性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

性能优化

因为JavaScript最初是一面解释型语言,执行速度比编译型语言低得多。Chrome引擎是一款内置优化引擎的浏览器,将JavaScript编译成本地代码。此后主流的浏览器都陆续实现了编译执行。

优化作用域

随着作用域链的增加,访问当前作用域链以外变量作用域的时间也在增加。而访问全局作用域比局部作用域要慢。所以减少访问作用域链的时间,就能提高性能。

1. 避免全局查找

我们可以将函数中多次用到的全局变量存储为局部变量,这样就不用每次都访问全局的变量了。例如:

        function Fun1() {

            for (var i = 0; i < 10; i++) {

                var num = document.getElementById("num").getAttribute("value");     //访问了10次全局变量document,时间复杂度O(n)

                console.log(num);

            }

        }



        function Fun2() {

            var num = document.getElementById("num");   //只访问一次全局变量document,时间复杂度O(1)

            for (var i = 0; i < 10; i++) {

                console.log(num.getAttribute("value"));

            }

        }

 

2. 避免不必要的属性查找

下面是JavaScript中常见的算法类型:

标记

名称

描述

O(1)

常数

不管有多少值,执行的时间是恒定的。一般表示简单值和存储在变量中的值。

O(log n)

对数

总的执行时间和值的数量有关,但是要完成算法并不一定要获取每个值。例如:二分查找

O(n)

线性

总执行之间和值的数量直接相关。例如:遍历某个数组的所有元素。

O(n2)

平方

总执行时间和值的数量有关,每个值至少要获取n次。例如:插入排序

使用遍历和数组要比访问对象上的属性更有效率。对象上的任何属性查找都要比访问变量或者数组花费更多的时间,因为必须在原型链中对拥有该名称的属性进行一次搜索。

 

3. 优化循环

循环是编程中最常见的,在JavaScript中也随处可见。优化循环是性能优化中很重要的一部分,由于它们会反复运行一段代码,从而自动增加执行时间。一个循环的基本步骤如下所示:

(1) 减值迭代 ---大多数循环使用一个0开始,增加到某个特定值的迭代器。在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效。

        function Fun5() {

            var obj = {

                count: 1000

            }

            for (var i = 0; i < obj.count; i++) {   //每次循环都会判断一次,访问一次count属性

                console.log(i);

            }

        }



        function Fun6() {

            var obj = {

                count: 1000

            }

            for (var i = obj.count - 1; i >= 0; i--) {  //只在初始化i时访问了一次count属性

                console.log(i);

            }

        }

 

(2) 简化终止条件---由于每次循环都会计算终止条件,所以必须保证它尽可能快。也就是说尽量避免属性访问等其他O(n)操作。

        function Fun7() {

            var obj = {

                count: 1000

            }

            var i = obj.count - 1;

            if (i > -1) {

                do {

                    console.log(i);

                }while(--i >= 0)

            }

        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值