var、let、const的区别

这篇文章详细介绍了ES6中var、let和const声明变量的区别,包括变量的作用域、提升、块级作用域以及常量的不可变性。var存在变量提升和无块级作用域问题,let解决了这些问题并引入了块级作用域,const则用于声明不可变的常量。
摘要由CSDN通过智能技术生成

var、let、const的区别

ES6之前我们主要使用var来声明变量,ES6中加入了let、const来声明变量,那么他们之间有什么区别呢?

首先我们要知道没有使用了var关键字定义变量,并且存在同名的全局变量,该变量等同于全局变量;

a=100;
console.log(a); //获取全局变量:a=100
function f() {
    console.log(a); //获取全局变量:a=100
    a=10;//修改全局变量:a=10
    console.log(a); //获取全局变量:a=10
}
f();//调用函数
console.log(a);//获取全局变量:a=10

第二没有使用了var关键字定义变量,不存在同名的全局变量,该变量提升为全局变量

function f() {
    a=10;//定义变量a,自动提升为全局变量:a=10
    console.log(a); //获取全局变量:a=10
}
f();//调用函数
console.log(a);//获取全局变量:a=10

存在问题:

1、局部变量如果和全局变量重名则会覆盖掉全局变量,

2、定义在函数内的变量在外部也可以访问

一、var的特性:

1、var定义的变量分为全局变量和局部变量
  • 定义在函数外的变量称为全局变量
  • 定义在函数内的变量称为局部变量
var a=100;
console.log(a); //a为全局变量 a=100
function f() {
    var a=10;
    console.log(a); //a为局部变量a=10
}
f();//调用函数
console.log(a)//a为全局变量a=100

var定义的局部变量不会覆盖掉同名的全局变量

function f() {
    var a=10;
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a is not defined

var定义的局部变量只能在函数内使用

2、var声明的变量存在变量声明提升
function f() {
    console.log(a);//变量声明自动提升到函数开始位置 a=undefined
    var a=10;
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a is not defined

var定义的变量没有暂时性死区,在代码块内,声明变量之前,该变量都是不可用的,这在语法上,称为“暂时性死区”

3、var声明的变量没有块级作用域
{
    console.log(a);//变量声明自动提升到函数开始位置 a=undefined
    var a=10;
    console.log(a); //a为局部变量a=10
}
console.log(a)//a可以正常访问 a=10

定义在代码块中的var变量可以在代码块以外的范围进行访问

二、let特性

let是ES6新增关键字,可以用来声明变量

1、let可以声明全局变量和局部变量
let a=100;
console.log(a); //a为全局变量 a=100
function f() {
    let a=10;
    console.log(a); //a为局部变量a=10
}
f();
console.log(a)//a为全局变量a=100

let定义的局部变量不会覆盖掉同名的全局变量

function f() {
    let a=10;
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a is not defined

let定义的局部变量只能在函数内使用

2、let声明的变量不存在变量声明提升
function f() {
    console.log(a);//Cannot access 'a' before initialization
    let a=10;
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a is not defined

初始化前无法访问“a”,let定义的变量没有暂时性死区

3、let声明的变量有块级作用域
{
    let a=10;
    console.log(a); //a为局部变量a=10
}
console.log(a)//a is not defined

三、const特性

const是ES6新增关键字,可以用来声明常量

1、可以声明全局常量和局部常量

const a=100;
function f(){
    const a=10;
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a为全局变量a=100

const定义的局部常量不会覆盖掉同名的全局常量

function f(){
    const a=10;
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a is not defined

const定义的局部常量只能在函数中使用

2、const声明的常量不存在变量声明提升

function f(){
    console.log(a);//Cannot access 'a' before initialization
    const a=10;
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a is not defined

3、const声明的常量有块级作用域

{
    const a=10;
    console.log(a); //a为局部变量a=10
}
console.log(a)//a is not defined

4、const声明的常量不可更改,但声明的对象属性可以更改

function f(){
    const a=10;
    a=20;//Assignment to constant variable
    console.log(a); //a为局部变量a=10
}
f();//函数调用
console.log(a)//a is not defined

const定义的number,string,boolean…不能改变

function f(){
    const obj={name:'Tom',age:20};
    obj.name='Jarry';//修改obj的name属性
    console.log(obj.name)//Jarry
}
f();//函数调用

const定义的对象属性可以改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值