var let const 的区别差异

var

  1. var声明的变量作用域是全局的或者是函数级的
  2. var声明变量存在变量提升(变量提升指的是变量声明的提升,不会提升变量的初始化和赋值)
console.log(a); // undefined  ===>  a已声明还没赋值,默认得到undefined值
var a = 100;
console.log(b); // 报错:b is not defined  ===> 找不到b这个变量
let b = 10;
console.log(c); // 报错:c is not defined  ===> 找不到c这个变量
const c = 10;

let (块级局部变量)

ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景,在ES6之前,大部分人会选择使用闭包来解决这个问题,今天我们使用ES6提供的let来解决这个问题。一个具有注脚的文本。

  1. let 约束了变量提升而不是没有变量提升
  2. let 禁止重复声明变量
    使用 var 可以重复声明变量,但是 let 不允许在同一块作用域内重复声明同一个变量;在相同的作用域或块级作用域中,不能使用 let 关键字来重置 let 关键字声明的变量
  3. let不会成为全局对象的属性
var a = 1;
console.log(window.a); //1
let b = 2;
console.log(window.b); // undefined
  1. 补充:ES6明确规定,如果区块中存在let命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。所以在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)
let a = 'outside';
if(true) {
   console.log(a);//Uncaught ReferenceError: a is not defined
    let a = "inside";
}

其他例子

for(let i = 0 ; i<5 ; i++) {
	let i = 'cht';
	console.log(i); // cht *5
}
console.log(i); //Error:i is not defined

在作用域之外 i 不能被访问。从上面for循环的中可以看出,设置变量那一部分是一个作用域,循环体内部是一个单独的作用域

const

  1. 和let的作用域是一致的,以上 let 的规则基本适用于 const
  2. const 声明一个只读的常量,一旦声明,常量值就不可以改变。所以const一旦声明就必须立即初始化。在声明时必须赋值不能先声明再赋值(注意:var let 只声明不赋值 : undefined)
const a; //Error: Missing initializer in const declaration
const a =3;  //3
  1. const定义的变量不允许修改
const aa =5;
aa=6;//err

5不能重新赋值const定义的值,但是可以修改const’声明的对象类型和数组

	// const 声明的引用类型 指针不能被修改
    const obj = {
        name : "cht",
        age : 15
    }
    obj = {
        job :  "Teacher"
    }
    //Error: Assignment to constant variable.

   // const 定义引用类型时,值可以被修改
   const obj = {
        name: "cht"
    }
    obj.name = "hw";
    console.log(obj.name)  // hw

// 创建常量数组
const cars = ["Saab", "Volvo", "BMW"];
 
// 修改元素
cars[0] = "Toyota";
 
// 添加元素
cars.push("Audi");

为什么const声明的基本类型变量不能被修改,而复杂类型变量就可以?
因为 const 保存的是指向数组或对象的指针。对于基本类型值,使用const声明的变量是不可以被修改的。但是对于对象,指针依然不能被修改,但是指针指向内容可以修改。

建议优先级 const>let>var

你可能感兴趣的:(var,let,const,javascript,es6)