1.let和var用来声明变量,const用来声明常量
变量就是赋值后可以改变它的值,常量就是赋值后就不能改变它的值
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所不得改动.对于基本类型的数据(数值、字符串、布尔值...),值就保存在变量指向的那个内存地址,因此等同于常量。但对于引用类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是不变的无法保证
const a; // 这是不允许的
const a = 3.14; // 必须赋值 a=5;//报错
const arry=['bbbb','aaaa']; arry[0]='ccc';console.log(arry[0])
2.var是函数作用域,let和const是块级作用域。
花括号{}就是块级作用域,函数作用域就是函数里面的内容。
{ var a = 'Smiley';} console.log(a) //正确打印
{ let a = 'Smiley';} console.log(a)// a is not defined
var result = new Array();
for (var i=0; i<10; i++) {
result[i] = function() {
return i;
}
}
console.log(result[0]())
结果返回10,这是因为所有的i都使用同一个引用,而i最终会被更新为10,因此,result中所有函数都会返回10
var result = new Array();
for (let i=0; i<10; i++) {
result[i] = function() {
return i;
}
}
console.log(result[8]());//8
在每次循环当中,都会创建一个新的let i,当前的i只在本轮循环内有效,所以每一次循环的i其实都是一个新的变量
3、var有变量提升的功能,即变量可以在声明之前使用,值为 undefined。let和const没有
console.log(a); //undefined
var a = 4;
console.log(a); //a is not defined
let a = 4;
4.使用 var 在全局级别(在函数外部)进行声明都会自动成为 window 对象上的一个属性
var name = 'John';
window.name === name // true
使用 let 或者 const 在函数外部声明一个变量,它不 会被添加到 window 对象中
let job = 'job'; window.job === job // false