JavaScript var, let, const difference All In One_letJavaScript var, let, const difference All In One



JavaScript var, let, const difference All In One

js var, let, const 区别 All In One

JavaScript var, let, const difference All In One_let_02

  1. 是否存在 hoisting

var 存在 hoisting; let, const 不存在 hoisting;

let, const 存在 TDZ 暂时死区,在定义之前,不可以访问

JavaScript var, let, const difference All In One_js in depth_03

const log = console.log;

log(`i =`, i);
// Uncaught ReferenceError: i is not defined

typeof i;

let i = 10;
// Uncaught ReferenceError: i is not defined


JavaScript var, let, const difference All In One_js_04

词法作用域

function test(){
var foo = 33;
if(foo) {
// Uncaught ReferenceError: Cannot access 'foo' before initialization
let foo = (foo + 55);
}
}
test();


  1. 作用域不同

var 是全局scope或函数 scope; let, const 是 block scope;

全局作用域里面定义的 const, let 不会挂载到 window 对象上面;

全局作用域里面定义的 var 会挂载到 window 对象上面;

JavaScript var, let, const difference All In One_let

const log = console.log;

var a = 1;
log(`a =`, window.b);

let b = 1;
log(`b =`, window.b);

const c = 1;
log(`c =`, window.c);


JavaScript var, let, const difference All In One_const_06

JavaScript var, let, const difference All In One_js_07

  1. 能否重复声明

var 可以重复声明; let, const 不可以重复声明



  1. 能否重新赋值

var 可以重新赋值, let 可以重新赋值; const 值类型不可以重新赋值, 但是如果是引用类型 Object 可以,如修改 Object 的属性值;



  1. 声明时否要初始化

var 可选初始化; let 可选初始化, 但是存在 TDZ(暂时死区); const 声明时必须初始化,存在 TDZ(暂时死区);