var、let和const区别(ES6)

let和const命令

ES6增加了两种新的声明方式,分别是letconst

 在学习let和const之前,我们先了解一下var

var 关键字介绍

特点:

       ①无块级作用域

if(true){
  var ql="My name is HQL";
}
console.log(ql);//My name is HQL

            ②存在变量提升

console.log(a);//undefined
var a=20;


//解析
var a;
console.log(a);//undefined
a=20;

         ③会成为window属性

var a = 2077;
var fn = function () {
  console.log(2077);
}
console.log(window.a);//2077
window.fn();//2077

 let关键字介绍

特点:

     ①只在代码块有效

//使用let声明的变量,只有在其所在的代码块中有效、,即只在块级作用域之内有效
if(true){
  let title="航海王"
}
console.log(title);
//(报错) Uncaught ReferenceError: title is not defined

分析:使用let声明的变量只在其所在代码块之内有效,在代码块之外访问会报错

     

  let title = '火影忍者';
    if (true) {
      let title = '航海王';
      console.log(title);
    }
    console.log(title);

//控制台输出
//航海王
//火影忍者



分析:  如果两个变量都是用var声明,最终console.log()都会输出"航海王"。
从这个例子可以看出,使用let来代替var,可以避免这种内层变量覆盖外层变量的不合理情况。

     ②同一代码块中,不允许重复声明

//使用let声明的变量,在其所在的代码块中是不允许重复声明的
 if(true){
    let title='火影忍者';
    let title='航海王';
    console.log(title);
//(报错)Uncaught SyntaxError: Identifier 'title' has already been declared
  }




分析:虽然在同一代码块中,变量名不允许被let重复声明,但是这个变量却可以被重新赋值。
注意:声明和赋值是两回事

  if (true) {
      let title = '火影忍者';
      title = '航海王';
      console.log(title);//航海王
    }

     ③不存在变量提升

//用let声明的变量不像用var声明的变量,会出现变量提升的现象
//用let声明的变量,只能在声明后使用,如果在声明之前使用,就会报错。
 案例一
console.log(title);//(报错)Uncaught ReferenceError: Cannot access 'title' before initialization
 let title='火影忍者';
案例二
 console.log(fn);//(报错)Uncaught ReferenceError: Cannot access 'fn' before initialization
    let fn = function () {
      console.log('火影忍者');
    }

     ④不会成为window属性

//在ES6之前,在全局作用域中,使用var声明的变量会成为window对象的属性。
//在ES6的全局作用域中,使用let声明的变量不会成为window对象的属性。



//ES5中的var
var a = 2077;
var fn = function () {
  console.log(2077);
}
console.log(window.a);//2077
window.fn();//2077



//ES6中的let
 let a = 2077;
    let fn = function () {
      console.log(2077);
    }
    console.log(window.a);//undefined
    window.fn();//(报错) Uncaught TypeError: window.fn is not a function

 const关键字介绍

const和let非常相似,两者有着4个共同点:①只在代码块之内有效②在同一代码块中,不允许重复声明③不存在提升变量④不会成为window的属性

const和let唯一的不同点:const用于定义一个常量,而常量是不允许重新赋值。

const PI = 3.145926;
    PI = 3.14;
    console.log(PI);//(报错)Uncaught TypeError: Assignment to constant variable.

我们所说的使用const声明的变量不能被修改,严格意义上说是保存变量值的内存地址不能被修改。

如果该值属于”基本类型“,那么声明后是不允许修改该值的。

常用的基本数据类型包括undefined、null、number、boolean、string;

如果该值属于”引用类型“,虽然我们不能修改该值,但是可以修改它属性的值。

引用数据类型也就是对象类型,比如:Object、array、function、data等;

 const person={
      name:'HQL',
      age:24
    }
    person.age=21;
    console.log(person);//{name: 'HQL', age: 21}

person对象的属性值被修改了,这是因为person对象是引用类型的对象,person保存的仅仅是对象的指针。这就意味着,const仅仅保证指针不会发生改变,修改对象的属性值不会改变对象的指针,所以是被允许的。

//让person指向一个新对象,结果会怎么样??
 const person = {
      name: 'HQL',
      age: 24
    }
    person = {
      name: 'LZ',
      age: 20
    }
    console.log(person);//(报错)Uncaught TypeError: Assignment to constant variable.

分析:使用const声明一个对象,那么修改对象属性的值是被允许的,但是修改对象的值是不被允许的。


//用const声明数组
  const arr = ['red','green', 'blue'];
    arr[0] = 'pink';
    console.log(arr);//['pink', 'green', 'blue']

分析:数组本身上也是一个对象

 暂时性死区

{
   console.log(a);
   let a=30;
 }

//(报错)Uncaught ReferenceError: Cannot access 'a' before initializatio

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值