欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

var let const声明变量的区别

发布时间:2025/4/16 编程问答 55 豆豆
生活随笔 收集整理的这篇文章主要介绍了 var let const声明变量的区别 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在js中定义变量的方式有三种,其中let和const关键字是来自ES6中的,下面将逐一介绍各个关键字声明变量的特点。

var声明变量

var 是一个 JS关键字,用来声明变量( variable 变量的意思 )。使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员。

1.js可以允许变量不声明直接使用

2.js中使用var声明的变量没有块级作用域

Js中没有块级作用域(在ES6之前)。

if(true){var num = 123;console.log(123); //123 } console.log(123); //123

由于js中没有块级作用域,所以在if内部定义的变量,在外部也可以直接调用进行访问。

let声明变量

ES6中新增用于声明变量的关键字let.

1.let声明的变有块级作用域

在es6之前,声明的变量是没有块级作用域的概念,但是在es6中用let声明的关键字有块级作用域。

• 块作用域指的是由 { } 包括。

• 在其他编程语言中(如 java、c#等),在 if 语句、循环语句中创建的变量,仅仅只能在本 if 语句、本循环语句中使用,如下面的Java代码:

java有块级作用域:

if(true){int num = 123;system.out.print(num); // 123 } system.out.print(num); // 报错

以上java代码会报错,是因为代码中 { } 即一块作用域,其中声明的变量 num,在 “{ }” 之外不能使用;

而与之类似的JavaScript代码由于没有块级作用域的概念,则不会报错(Js中没有块级作用域(在ES6之前))

if(true){var num = 123;console.log(123); //123 }console.log(123); //123

但是ES6中固定使用let关键字声明的变量有块级作用域

if (true) { let a = 10;} console.log(a) // a is not defined

注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性。

2.let声明变量不存在变量提升

JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行。

  • 预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义。
  • 代码执行: 从上到下执行JS语句。

注意: 预解析会把变量和函数的声明在代码执行之前执行完成。

变量预解析:

预解析也叫做变量、函数提升。
变量提升(变量预解析): 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升。

console.log(num); // 结果是多少? var num = 10; // ?结果:undefined

由于javascript有变量提升机制,所以可以在变量的声明之前就调用该变量,因为变量提升会将变量的声明提升到最前面,但是变量的提升不会对值进行提升,所以变量没有赋值之前的默认值是undefined.

但是由于变量的提升导致在日常的开发中,会遇到很多奇怪的问题,所有ES6规定,使用let关键字声明的变量没有变量的提升。

console.log(a); // a is not defined let a = 20;

注意:使用let关键字声明的变量才没变量的提升,使用var关键字声明的变量依旧有变量的提升。

3.暂时性死区

在js中采取从上一级就近原则的方式来查找变量最终的值。

但是利用let声明的变量会绑定在这个块级作用域,不会受外界的影响。

var temp = 123;if (true) {temp = "abc";let temp;console.log(temp);}

按照以前的就近原则的特点,此时控制台因该输出“abc”,但是结果真的是这样吗?

在ES6中规定,使用let关键字声明的变量在块级作用域中具有暂时性死区的特性。简单来讲,就是在块级作用域中使用let声明的关键字要符合let关键字的性质,和以前的不一样。

例如:上面的例子由于在块级作用域声明了temp变量,但是在声明temp之前,尽然对temp变量赋值“abc”,这就触犯了let关键字没有变量提升的规则,在还没声明变量之前就给未声明的变量赋值,报错。


不能再初始化之前访问“temp”.

注意:只有使用let关键字声明的变量才有暂时性死区的特性。

4.let可以防止循环变量变成全局变量


经典面试题图解:此题的关键点在于每次循环都会产生一个块级作用域,每个块级作用域中的变量都是不同的,函数执行时输出的是自己上一级(循环产生的块级作用域)作用域下的i值.

5.小结

  • let关键字就是用来声明变量的
  • 使用let关键字声明的变量具有块级作用域
  • 在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
  • 防止循环变量变成全局变量
  • 使用let关键字声明的变量没有变量提升
  • 使用let关键字声明的变量具有暂时性死区特性

const声明常量

声明常量,常量就是值(内存地址)不能变化的量。

1.具有块级作用域

if (true) { const a = 10;} console.log(a) // a is not defined

2.声明变量的时候必须赋值

const PI; // Missing initializer in const declaration

3.常量赋值后,值不能修改

const PI = 3.14; PI = 100; // Assignment to constant variable.const ary = [100, 200]; ary[0] = 'a'; ary[1] = 'b'; console.log(ary); // ['a', 'b']; ary = ['a', 'b']; // Assignment to constant variable.

由于使用const声明的常量赋值之后不能修改,这就有点像java中使用private修饰的变量。例如上面的例子,PI由于声明的时候进行了赋值操作,所以就不能进行二次赋值操作,但是对于数组而言由于const关键字声明的常量是ary,所以对于ary是不能进行二次赋值,但是对于数组储存的值是不属于const管的。const管理的只是const声明的变量不能二次赋值,而对于变量中储存的是什么,是没有约束力的。

4.小结

  • const声明的变量是一个常量
  • 既然是常量不能重新进行赋值,如果是基本数据类型,不能更改值,如果是复杂数据类型,不能更改地址值。
  • 声明 const时候必须要给定值

let、const、var 的区别

  • 使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
  • 使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升
  • 使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值

总结

以上是生活随笔为你收集整理的var let const声明变量的区别的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。