javascript在v8引擎加持下的必备性能优化

  1. 尽量的用const和let,少用var;
  • 因为在通常情况下var a = 1,等于window.a = 1;
var a = 1;
   console.log(a === window.a);//true
复制代码

2.在用const和let的过程中,在确保定义的常量不会变的情况下能用const尽量用const,能有效避免值的重复声明。

3.减少闭包的使用,闭包会让垃圾回收机制跳过清理该变量。(定时器也会造成一只占用内存的情况)

//定时器
let name = 'jack';
settimeout( () => {
  console.log(name)
},200);
//闭包
function test(){
  let name = 'rock';
  return function(){
  return name;
  }
}
复制代码

4.隐藏类
在v8引擎中,会存在这种情况:创建了两个对象,这两个变量是由同一个构造函数生成的。

function cunstor(){
  this.name = 'wow';
}
let aaa = new cunstor();
let bbb = new cunstor();
复制代码

在这种情况下,aaa和bbb两个对象共享同一个隐藏类。
但是如果其中一个对象增加了一个属性,如:

bbb.age = 33;
复制代码

在这种情况下,两个cunstor实例就会对应两个不同的隐藏类,根据操作频率和隐藏类的大小,可能会造成性能影响。

另外,delete也会造成隐藏类的增加。
如:

function cunstor(){
  this.name = 'wow';
  this.age = 100;
}
let aaa = new cunstor();
let bbb = new cunstor();
//这个时候是共享的-同一个隐藏类
delete bbb.age;
由于delete操作,使得aaa和bbb就是使用的两个不相同的隐藏类。

复制代码

如果想尽量避免过多的生成隐藏类,可以使用下面这两种方式避免:

//方法1:(增加属性的场景)
function cunstor(age){
  this.name = 'wow';
  this.age = age;
}
let aaa = new cunstor();
let bbb = new cunstor(age);
//此时aaa.age为undefined,但是aaa和bbb是共享的同一个隐藏类
//==================================================================================
//方法2:(删除属性的场景)
function cunstor(){
  this.name = 'wow';
  this.age = 100
}
let aaa = new cunstor();
let bbb = new cunstor();
bbb.age = null;
//在需要删除某个属性和属性值时,使用将该值赋值为null的方式,这样aaa和bbb也是指向的同一个隐藏类

复制代码

5.合理运用垃圾回收机制,如在使用完变量后将其赋值为null,从而告知垃圾回收机制释放内存。

6.在某些浏览器中可以主动触发垃圾回收,如IE中window.collectGarbage()和opear7+中window.opera.collect(),但是不推荐使用。

7.静态分配,减少块级作用域中变量的重复声明(通常用不到这么极端的优化方法)

//如果这个函数的使用周期很短,垃圾回收就会很快介入将result所占内存空间清理出来,这种情况下频繁使用test1函数会造成result的频繁声明和垃圾回收机制的频繁介入,影响性能。
funciton test1(num1,num2){
let result = new otherRes();
reault.a += num1;
result.b += num2;
}

//可以使用这种方式,把result定义在外边,这样频繁使用该函数的时候就不会频繁触发垃圾回收。
let result = new otherRes();
funciton test1(num1,num2){
reault.a += num1;
result.b += num2;
}

复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享