博客
关于我
var 与 const let的区别
阅读量:192 次
发布时间:2019-02-28

本文共 2265 字,大约阅读时间需要 7 分钟。

var、let、const 的区别与特点

在 JavaScript 中,变量声明关键字 varletconst 是非常重要的概念。它们在变量的声明、重新赋值、作用域等方面存在显著差异。本文将详细分析这三种关键字的特点及其区别。


一、var 的特点

var 是 JavaScript 中最古老的变量声明关键字。与 letconst 不同,var 的声明具有变量提升的概念。即使变量在声明之前已经被使用,只要在当前作用域内进行声明,变量会被提升到该作用域的顶层。

代码示例:

console.log(a); // undefinedvar a = 100;

在上述代码中,a 在第一次被访问时返回 undefined,这是因为 var 的提升特性会将变量提升到当前作用域的顶层。

var 的作用域

var 关键字声明的变量具有函数级的作用域。换句话说,var 声明的变量可以在其所在的函数以及该函数的所有子函数中被访问和修改。

代码示例:

function outer() {    var a = 100;    function inner() {        a = 10;        console.log(a); // 10    }    inner();}outer();

在上述代码中,inner() 函数中可以修改 outer() 函数中的 a,这充分体现了 var 的函数级作用域特性。


二、let 的特点

let 是 ES6 引入的一个变量声明关键字。与 var 不同,let 的变量具有块级作用域。换句话说,let 声明的变量只能在其所在的代码块(例如 if 语句、for 循环、functionblock)中被访问和修改。

代码示例:

if (1) {    let b = 10;    console.log(b); // 10}console.log(b); // TypeError: b is not defined

在上述代码中,b 只能在 if 代码块内被访问。外部访问时会抛出 TypeError

let 的变量提升

var 不同,let 不具有变量提升的特性。如果变量在声明之前被访问,会抛出 ReferenceError

代码示例:

console.log(b); // TypeError: b is not definedlet b = 10;

在上述代码中,直接访问 b 会抛出错误,因为 let 的变量提升特性仅适用于声明时。


三、const 的特点

const 是 ES6 中引入的一种变量声明方式。与 varlet 不同,const 声明的变量具有常量的特性。const 声明的变量在声明后不能被重新赋值,除非使用 letvar 进行重新声明。

代码示例:

const a = 100;console.log(a); // 100

在上述代码中,a 被声明为常量,不能被重新赋值。例如:

a = 200; // TypeError: a is read-only

const 的块级作用域

const 声明的变量与 let 类似,具有块级作用域。const 变量只能在其所在的代码块内被访问和修改。

代码示例:

if (1) {    const c = 1;}console.log(c); // TypeError: c is not defined

在上述代码中,c 只能在 if 代码块内被访问。外部访问时会抛出 TypeError


四、varletconst 的区别

1. 变量提升

  • var 声明的变量具有变量提升的特性。
  • letconst 不具有变量提升的特性。

2. 重新赋值

  • varlet 声明的变量可以被重新赋值。
  • const 声明的变量不能被重新赋值。

3. 作用域

  • var 声明的变量具有函数级作用域。
  • letconst 声明的变量具有块级作用域。

4. 暂存死区

  • letconst 声明的变量在声明之前存在暂存死区。
  • var 声明的变量在声明之前也存在暂存死区,但与 letconst 不同,var 的暂存死区在块级别存在。

5. 同一个作用域内的变量声明

  • var 允许在同一个作用域内多次声明同一个变量。
  • letconst 不允许在同一个作用域内多次声明同一个变量。

五、const 的特殊情况

const 声明中,如果变量的值是对象(引用类型),可以修改其属性。例如:

const obj = { a: 100 };obj.a = 10000;console.log(obj.a); // 10000

但是,const 声明的变量不能被重新赋值为其他对象。例如:

const obj = { a: 100 };obj = { a: 200 };// TypeError: reassigning const target

这与 let 声明的变量类似,let 声明的变量也不能被重新赋值为其他对象。


六、总结

  • var:支持变量提升,具有函数级作用域,允许在同一个作用域内多次声明同一个变量。
  • let:支持块级作用域,具有变量提升的替代品,不允许在同一个作用域内多次声明同一个变量。
  • const:不支持变量提升,具有块级作用域,不能被重新赋值,不允许在同一个作用域内多次声明同一个变量。

理解这些概念对于编写高质量的 JavaScript 代码至关重要。

转载地址:http://ygni.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
查看>>
NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
查看>>
NIH发布包含10600张CT图像数据库 为AI算法测试铺路
查看>>
Nim教程【十二】
查看>>
Nim游戏
查看>>
NIO ByteBuffer实现原理
查看>>
Nio ByteBuffer组件读写指针切换原理与常用方法
查看>>
NIO Selector实现原理
查看>>
nio 中channel和buffer的基本使用
查看>>
NIO三大组件基础知识
查看>>
NIO与零拷贝和AIO
查看>>
NIO同步网络编程
查看>>
NIO基于UDP协议的网络编程
查看>>
NIO笔记---上
查看>>