var,let,const的区别

  1. var声明的变量会挂载在window上,而let和const声明的是块作用域
  2. var声明的变量存在变量提升,而let和const声明的不会
  3. 同一作用域下let和const不能能声明同名变量,而var可以
  4. const变量一旦声明必须赋值,不能使用null占位符,声明后(地址)不可再修改(地址内的内容已可修改,不可重新分配内存)

详解:

1. var

var定义的变量,没有块的概念,可以跨块访问,不可以跨函数访问,(如果定义为全局变量,是可以跨函数访问的)
可以重新赋值(变量提升)

var a = 1;
  // var a;//不会报错
  console.log('函数外var定义a:' + a);//可以输出a=1
  function change(){
    a = 4;
    console.log('函数内var定义a:' + a);//可以输出a=4
  }
change();
console.log('函数调用后var定义a为函数内部修改值:' + a);//可以输出a=4

2.let

let定义的变量,只能在块作用域内访问,不能跨块访问,也不能跨函数访问,无变量提升,也不可以重复声明

'use strict';
function func(args){
    if(true){
        let i = 6;
        console.log('inside: ' + i);  //不报错
    }
    console.log('outside: ' + i);  // 报错 "i is not defined"
};
func();

let声明的变量只在块级作用域内有效

// 不存在变量提升
'use strict';
function func(){
    console.log(i);
    let i;
};
func(); // 报错

不存在变量提升,而是‘绑定’在暂时性死区(TDZ)

'use strict';
var test = 1;
function func(){
    console.log(test);
    let test = 2;
};
func();  // 报错

在let 声明变量前使用该变量,会报错,而不是像var声明的 会‘变量’提升。
严格上说,没有提升变量是不对的,或者说它提升了,但es6规定变量没有声明之前不可以使用。
如果let声明的test没有被提升,那么打印出来的应该是var声明的test,而他却报错,说明它提升了,只是规定了在声明之前不可以使用,我们称这一特性称为暂时性死区(temporal dead zone),且这一特性,仅对块级作用域的命令有效(let const)

3. const

const用来定义常量,使用时必须初始化,(必须赋值),只能在块作用域里访问,不可被修改,无变量提升。
const和let的使用一样,不同的是const声明的是一个常量,且必须被赋值,否则就会报错。
注意:const声明的常量,指的是这个常量的内存地址不可被改变,而不是对应的值不可被改变

'use strict';
function func(){
    const PI;
    PI = 3.14;
    console.log(PI);
};
func(); // 报错“Missing initializer in const declaration”

你可能感兴趣的:(var,let,const的区别)