1.var存在变量提升且声明的变量会挂载在window上,let和const不存在变量提升;
console.log(c); var c = 'c';//undefined(会进行c的提前解析,再执行。var默认为undefined,只有赋值才会变成对应的值); let c = 'c';//let不存在变量提升,不会进行域解析;
var a = 100; console.log(a,window.a);//100,100 let a=100; console.log(a,window.a);//100 undefined const a =100; console.log(a,window.a);//100 undefined
2.同一作用域下能重复定义同一个名称
var d = 1; var d =100; console.log(d);//100 let e = 1; let e = 100; console.log(e);//报错has already been declared;
let e = 1; e = 100; console.log(e);//100,不可以重复定义,但能改变值
3.有严格的作用域 (var函数作用域,let块级作用域)
// var 在当前函数作用域中可拿到值,函数外不行 function fun(){ var n = 10; if(true){ var n =100; } console.log(n); }; fun()//100; // let function fun(){ let n = 10; if(true){ let n =100; } console.log(n); }; fun()//10,n=10作用在函数中,n=100作用在if判断中,作用域不同。
4.const 声明一个只读的常量,一旦声明,常量的值就不能改变;(与var对应的区别同let)
const m = 100; m=200; console.log(m);//error const r;//error 一旦声明就要赋值,不能只声明不赋值;
const obj = {}; obj.name ="baby"; console.log(obj);//{name:"baby"}复杂数据类型的值可以改变,内存地址不可以改变,地址内的值可以改变; const arr =[]; arr.push(1);//1