var和let类型的比较
如果使用的是var声明变量,则是全局变量(除在函数体内部,是一种特殊情况);如果是let声明变量,则是局部变量。如果是使用循环的话,比如典型的for循环,推荐使用let定义增加或者较少的那个变量;若使用var声明,则这个值会一直存在。
for(var m = 1;m< 5;m++){
console.log(m);
}
for(let n= 1;n < 5;n++){
console.log(n);
}
console.log(m);
console.log(n);
测试结果:
写这个内容起初是看到一个博主的文章,文章链接
但是这个博主写的内容有一点问题,在这里指正一下,做出正确的解释。
//使用var类型遍历数组
var a=[1,2,3]
for(var i=0;i<3;i++){
setTimeout(function(){
console.log(a[i-1]); // i的值一直等于3
},0)
}
//输出结果是333
//使用let类型遍历数组
var b=[1,2,3]
for(let i=0;i<3;i++){
setTimeout(function(){
console.log(b[i]);
},0)
}
//输出结果是123
这里面如果仅仅想打印数组里面的值,推荐使用let,以防止i值没有被垃圾回收机制销毁。此处代码使用var打印的结果一直都是3,是因为使用了setTimeout,这是一个异步函数,会先执行加操作,直至i的值为4;然后开始执行console打印,但此时由于var声明的原因,i的值已经等于4了,打印333之后退出循环。使用let则不存在这一现象,很好地打印出来了数组b的内容。
变量提升
根据《ES6标准入门》书中的描述,var命令会发生“变量提升”现象,即变量在声明之前使用,值为undefined;为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则就报错。
//var的情况
console.log(foo);
var foo = 2;
//let的情况
console.log(f0);
let fo = 2;
使用for…in和for…of的区别
for…of遍历出的结果是value;for…in遍历出的结果是key
var numbers = ['一','二','三']
for(let num of numbers){
console.log(num);
}
for(let num in numbers){
console.log(num);
}