1.var和let
function testVar(){
var a=30;
if(true){
var a=50;
console.log(a);//50
}
console.log(a);//50
}
function testLet(){
let a=30;
if(true){
let a=50;
console.log(a);//50
}
console.log(a);//30
}
testLet()
上面例子的结果不同是因为let和var定义的变量的作用域不同。
let允许你声明一个作用域被限制在块级中的变量、语句或者表达式。与var关键字不同的是,var声明的变量只能是全局或者整个函数块的。
let声明的变量只在其声明的块或子块中可用,这一点,与var相似。二者之间最主要的区别在于var声明的变量的作用域是整个封闭函数。
for(var i=0;i<10;i++){
console.log(i)//0,1,2,3,4,5,6,7,8,9
}
console.log(i)//10
for(let i=0;i<10;i++){
console.log(i)//0,1,2,3,4,5,6,7,8,9
}
console.log(i)//i is not defined 因为这时候i的作用域只在for循环的花括号里
在程序或者函数的顶层,let并不会像var一样在全局对象上创造一个属性,比如
var x = 'global';
let y = 'global';
console.log(this.x); // "global"
console.log(this.y); // undefined
2.const
const定义的常量一般不可以改变,比较特殊的是数组,const可以定义一个常量数组,数组的内容可以改变但是常量类型不能改变
const x=100
x=100//报错
//x是常量不能改变
const x=[]
x.push('zs')//不会报错
x=""//报错
//const定义的数组可以改变数组里面的内容,但是不能改变数据类型