先上代码: //测试let和var的性能区别,let比var还是要慢很多; /*var start = new Date(); for (var i = 0; i < 10000000; i++) { var num = 123; var str = ‘abc’; var obj = { key: ‘value’ }; var arr = [‘bill’, ‘dell’]; } var end = new Date(); */ let start = new Date(); for (let i = 0; i < 10000000; i++) { let num = 123; let str = ‘abc’; let obj = { key: ‘value’ }; let arr = [‘bill’, ‘dell’]; } let end = new Date();
console.log(end - start);
上面的测试,用let比var差了大概3倍,就是说let所用的时间是var的三倍。 那么我们用let代替var值得吗?特别是nodejs这种特别注重性能的服务器程序。
代码写的好逻辑清晰,var完全没有问题。但是如果逻辑很复杂,let的块级作用域会帮你大忙~
为什么我在浏览器执行的结果和楼主刚好相反啊? 在node环境下var还是稍微快点:
'use strict'
const Benchmark = require('benchmark')
const suite = new Benchmark.Suite
function letEL() {
for (let i = 0; i < 10000000; i++) {
let num = 123;
let str = 'abc';
let obj = {
key: 'value'
};
let arr = ['bill', 'dell'];
}
}
function varEL(){
for (var i = 0; i < 10000000; i++) {
var num = 123;
var str = 'abc';
var obj = {
key: 'value'
};
var arr = ['bill', 'dell'];
}
}
suite
.add('#letEL',() => {
letEL()
})
.add('#varEL',() => {
varEL()
})
.on('cycle',event => {
console.log(event.target + '')
})
.on('complete',function(){
console.log(`Fastest is ${this.filter('fastest').map('name')}`)
})
.run({async:true})
这种测试方法不够严谨
@gjc9620 那怎么才算严谨呢?
感觉这已经是很基础的用法了,这个方式差了3倍那就是真的有差距。
@solee0524 如果是初学者用let确实会严谨很多,但是以前没let的时候,js还不是一样的蓬勃发展,说明var还是够用的。
@gjc9620 为什么你这种测试感觉差距不大,我测出来真有三倍的差距,我的机器上var是80左右,let是250左右。
不要担心,写好代码就行。 这些东西会随着引擎优化
来自酷炫的 CNodeMD
@xueyou2000 说得好
@xueyou2000 豁然开朗😆 From Noder
跟 V8 的实现有关吧,不过未来 let 的性能肯定比 var 好。
Chrome 53 控制台的测试结果:
console.time('timer1')
for (var i = 0; i < 10000000; i++) {
var num = 0
var str = ''
var obj = { a: 'a' }
var arr = []
}
console.timeEnd('timer1')
console.time('timer2')
for (let i = 0; i < 10000000; i++) {
let num = 0
let str = ''
let obj = { a: 'a' }
let arr = []
}
console.timeEnd('timer2')
// VM1496:8 timer1: 295.353ms
// VM1496:17 timer2: 140.365ms
Node6.6 REPL 的测试结果
console.time('timer1')
for (var i = 0; i < 10000000; i++) {
var num = 0
var str = ''
var obj = { a: 'a' }
var arr = []
}
console.timeEnd('timer1')
// timer1: 298.765ms
console.time('timer2')
for (let i = 0; i < 10000000; i++) {
let num = 0
let str = ''
let obj = { a: 'a' }
let arr = []
}
console.timeEnd('timer2')
// timer2: 3499.564ms
绝大多数人写js应该还没有严格到需要研究var
和let
到底哪个性能更好。把代码写的漂亮,逻辑清晰,扩展性好,才是首要的吧…当然,有怀疑精神是非常值得肯定的
一直保持使用最新得
之前我也有这疑问 https://cnodejs.org/topic/568b1f503b33070b6627089b
最后还是使用let
了,使用let
可以避免大部分不必要的错误和歧义,性能的话还是交给引擎去解决吧
能用 const
尽量用 const
。
@xadillax 说到const我就有点糊涂了,求教一下。 一般来说,我 const path = require(‘path’); 是没有问题的吧?
在express的router里面呢? const express = require(‘express’); const router = express.Router(); 这样好像也没什么问题吧?
那const的不可变是怎么理解?
@klausgao const是不改变其引用
const obj = {a:1};
//错误
obj = {a:2};
//正确
obj.a = 2;
@klausgao 具体就是,对于对象,例如楼上的举例子的对象使用方法, 指的是对象的指向不可变, 但是属性值什么的还是可以更改的, 再比如常量const a = 2; 此时 a = 3就会报错, 是不能直接更改的. 我的理解是const 声明的变量 对于对象obj,指的是对象指向的存储地址不变就行, 对于常量a 就是a指向的值不变即可!
可维护性比性能重要得多, 性能有问题可以加台服务器就搞定,已经上线的代码如果因为全局变量的问题找不到出原因,解决不了bug,那就只能哭了
循环一亿次能差出来1秒,除非是死循环否则没必要这样吧? 另外代码写的也有问题,试试这段代码,性能几乎相当,我测试是var稍微慢点
const timeVar = () => {
console.time('var');
for (var i = 0; i < 10000000; i++) {
var num = 123;
var str = 'abc';
var obj = {
key: 'value'
};
var arr = ['bill', 'dell'];
}
console.timeEnd('var');
};
const timeLet = () => {
console.time('let');
for (let i = 0; i < 10000000; i++) {
let num = 123;
let str = 'abc';
let obj = {
key: 'value'
};
let arr = ['bill', 'dell'];
}
console.timeEnd('let');
};
timeVar();
timeLet();