【ES6】让你彻底搞懂const ,let和var的区别

前言

想必许多学习JS的同学都被const、let和var搞得晕头转向,一直傻傻分不清这三者的区别,本文将全面阐述清这三者的前世今生。

首先,说到JS就不得不提到他的好兄弟ECMAScript,ECMAScript是一个国际通过的标准化脚本语言。JavaScript由ECMAScript和DOM、BOM三者组成。可以简单理解为:ECMAScript是JavaScript的语言规范,JavaScript是ECMAScript的实现和扩展。

2011年,ECMAScript 5.1版发布,之前大部分人用的也就是ES5。

2015年6月,ECMAScript 6 正式通过,成为国际标准,而let和const也就是这个时候出现在大众视野。

var
  • var是在ES5中引入的变量关键字
  • 函数作用域:在函数内部声明的变量只在该函数内可见
function test() {
  var num = 10;
  console.log(num);
}
test(); // 打印结果为num = 10

console.log(num); // 报错:num is not defined
  • 如果在同一个作用域内使用var多次声明同名变量,后面的变量会覆盖前面的
var age = 10;
var age = 20;
console.log(age);//age = 20
  • var声明的变量可以在声明之前被访问(变量提升),但是在变量声明之前使用它,其值会是 undefined
console.log(num);
var num = 10;// undefined
let
  • 块作用域:在{}块内声明的变量只在该块内可见
let num = 10;
if (true) {
  let num = 20;
  console.log(num);// 打印结果为num = 20
}
console.log(num);// 打印结果为num = 10
  • 不允许重复声明,在同一作用域内不能重复声明同一个变量,否则会报错
if (true) {
  let num = 20; 
  let num = 30; // SyntaxError: Identifier 'num' has already been declared
  console.log(num);
}
  • 暂时性死区:在块作用域里,变量在声明前是不可访问的
if (true) {
  console.log(num); // ReferenceError: Cannot access 'num' before initialization
  let num = 10;
}
const
  • 块作用域:和let差不多
const num = 10;
if (true) {
  const num = 20;
  console.log(num); // 20
}
console.log(num); // 10
  • 不允许重复声明,必须初始化,定义变量时赋值,一旦赋值后就不能重新赋值
const num = 10
const num = 20 // SyntaxError: Identifier 'num' has already been declared
  • 对于基本数据类型,一旦赋值不能更改,对于复合数据类型(对象,数组),不能改变其内存地址,但是能改变这个对象或数组的内容
const obj = { a: 1 }
obj.a = 2 // 合法,因为修改的是对象的内容
console.log(obj); // 输出 {a: 2}

const arr = [1, 2, 3]
arr.push(4) // 合法,因为修改的是数组的内容
console.log(arr); // 输出 [1,2,3,4]

const num = 10
num = 20 // 抛出 TypeError: Assignment to constant variable.

小结

constletvar都是声明变量的关键字,他们有以下几个方面的区别:

1.重复声明:var可以在同一作用域内重复声明变量,constlet不行。

2.作用域:constlet都是块级作用域,var是函数作用域

3.变量提升:var具有变量提升的特点,constlet不具有该特点
,在使用var关键字声明变量时,变量声明会被提升到作用域顶部,因此可以在变量声明之前访问变量;而在使用constlet关键字声明变量时,访问未声明和未初始化的变量会抛出ReferenceError异常。

4.赋值:使用const关键字声明的变量必须在声明时进行初始化,并且初始化后不能再修改变量的值(复合数据类型的值可以发生改变,但不可以改变类型);而使用let关键字声明的变量可以在声明后重新赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值