JavaScript中关键字 var、let、const的区别详解

 更新时间:2023年08月09日 08:27:16   作者:cbzone  
在JavaScript中,var、let和const是用于声明变量的关键字,它们之间存在一些区别,这篇文章就给大家详细介绍一下它们之间的区别,文章通过代码示例介绍的非常详细,需要的朋友可以参考下
#编程语言/JavaScript 

思维导图:

一 . var关键字

在 ES5 及之前的版本中,JavaScript 使用  var  关键字声明变量。以下是  var  的用法:

var x = 10;

  • var  声明的变量具有函数作用域,它在声明它的函数内部有效,如果在函数外部声明,它会成为全局变量。
  • 变量提升:使用  var  声明的变量会被提升到其所在作用域的顶部。这意味着你可以在变量声明之前访问它,但它的值会是  undefined
  • 可重复声明:使用  var  可以多次声明同一个变量,而不会引发错误。
function example() {
  var x = 10;
  if (true) {
    var x = 20; // 同一个变量 x 被重新赋值
    console.log(x); // 输出 20
  }
  console.log(x); // 输出 20
}
example();

在上面的示例中,内部的  var x = 20  重新赋值了外部的  var x = 10 。这是因为  var  声明的变量没有块级作用域,所以两个声明实际上是同一个变量。

二 . let关键字

ES6 引入了  let  关键字,用于声明块级作用域的变量。以下是  let  的用法:

let x = 10;
  • let  声明的变量具有块级作用域,它在包含它的块级作用域内有效。块级作用域可以是函数、 if  语句、 for  循环等。
  • 不会变量提升:使用  let  声明的变量不会被提升到作用域顶部。在声明之前访问  let  变量会导致引用错误。
  • 不可重复声明:在同一个作用域内重复使用  let  声明同一个变量会引发错误。
function example() {
  let x = 10;
  if (true) {
    let x = 20; // 不同作用域的不同变量 x
    console.log(x); // 输出 20
  }
  console.log(x); // 输出 10
}
example();

在上面的示例中,内部的  let x = 20  声明的变量和外部的  let x = 10  是两个不同的变量,因为它们在不同的块级作用域中。

三 . const关键字

const  关键字也是在 ES6 中引入的,用于声明常量。以下是  const  的用法:

const x = 10;
  • const  声明的变量也具有块级作用域。
  • const  声明的变量必须进行初始化,并且不能重新赋值给其他值。
  • 对于基本类型(如数字、字符串),其值是不可变的。
  • 对于对象和数组, const  声明的变量是对对象或数组的引用不可变,但对象或数组内部的属性可以被修改。
const x = 10;
x = 20; // 错误,不能重新赋值给 x
const obj = { name: "John" };
obj.name = "Jane"; // 可以修改对象属性
obj.age = 25; // 可以添加对象属性
console.log(obj); // 输出 { name: 'Jane', age: 25 }

在上面的示例中, const  声明的  x  不能被重新赋值,而  obj  对象的属性可以被修改和添加,但是不能对  obj  进行重新赋值。

四 . 总结:

  • 使用  var  声明变量具有函数作用域和变量提升的特性。
  • 使用  let  声明变量具有块级作用域,不会变量提升,并且不可重复声明。
  • 使用  const  声明常量具有块级作用域,不能重新赋值,并且对于基本类型是不可变的,对于对象和数组是浅不可变的。

建议在 JavaScript 中使用  let  和  const  来声明变量,因为它们提供了更好的作用域控制和可读性,并且可以避免一些常见的错误。只在需要兼容旧版本 JavaScript 或特殊情况下使用  var

五 . 使用let和const可以避免的常见错误

变量提升导致的引用错误

console.log(x); // undefined
var x = 10;
console.log(y); // ReferenceError: y is not defined
let y = 20;

使用  var  声明的变量会被提升到作用域的顶部,这可能会导致在变量声明之前访问变量而得到  undefined  的值。通过使用  let  和  const ,变量不会被提升,所以在声明之前访问变量会引发引用错误

变量重复声明

var x = 10; // OK
var x = 20; // OK
let y = 10; // OK
let y = 20; // Error: Identifier 'y' has already been declared

使用  var  声明变量时,可以在同一个作用域中多次声明同一个变量而不会引发错误。这可能会导致意外的行为和 bug。使用  let  和  const  声明变量时,如果在同一作用域内重复声明同一个变量,将会引发错误,帮助开发人员及时发现并修复问题。

意外的全局变量

function example() {
  var x = 10;
  if (true) {
    var x = 20;
    console.log(x); // 20
  }
  console.log(x); // 20 (意外的修改了外部变量 x 的值)
}
example();
function example() {
  let y = 10;
  if (true) {
    let y = 20;
    console.log(y); // 20
  }
  console.log(y); // 10 (不会修改外部的变量 y 的值)
}
example();

使用  var  声明的变量在函数外部声明时会成为全局变量,这可能会导致变量在不同的上下文中被意外修改,从而引发错误。使用  let  和  const  可以将变量限制在块级作用域内,避免了意外的全局变量问题。

常量重新赋值

const PI = 3.14159;
PI = 3.14; // TypeError: Assignment to constant variable.

使用  const  声明常量时,不能重新赋值给其他值。这有助于确保常量的值在声明后保持不变,防止不必要的修改和错误。

对象和数组的不可变性

const person = { name: 'John' };
person.age = 30; // 可以修改对象的属性
person = { name: 'Jane' }; // TypeError: Assignment to constant variable.
const numbers = [1, 2, 3];
numbers.push(4); // 可以向数组添加元素
numbers = [1, 2, 3, 4]; // TypeError: Assignment to constant variable.

使用  const  声明对象和数组时,虽然变量本身是不可变的,但对象和数组内部的属性仍然可以修改。这意味着可以修改对象的属性或向数组添加元素,但不能将整个对象或数组重新赋值为其他对象或数组。

通过使用  let  和  const ,可以在开发过程中提供更严格的变量声明和作用域规则,帮助开发人员避免一些常见的错误,并提高代码的可靠性和可读性。

以上就是JavaScript中关键字 var、let、const的区别详解的详细内容,更多关于JavaScript中var、let、const的区别的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript+HTML5 canvas实现放大镜效果完整示例

    JavaScript+HTML5 canvas实现放大镜效果完整示例

    这篇文章主要介绍了JavaScript+HTML5 canvas实现放大镜效果,结合完整实例形式分析了javascript+HTML5 canvas针对图片元素的获取、响应鼠标事件变换元素属性相关操作技巧,需要的朋友可以参考下
    2019-05-05
  • JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    这篇文章主要介绍了面向对象JS基础讲解,工厂模式、构造函数模式、原型模式、混合模式、动态原型模式,需要的朋友可以参考下
    2014-08-08
  • artDialog+plupload实现多文件上传

    artDialog+plupload实现多文件上传

    这篇文章主要介绍了artDialog+plupload实现多文件上传的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 中高级前端必须了解的JS中的内存管理(推荐)

    中高级前端必须了解的JS中的内存管理(推荐)

    这篇文章主要介绍了中高级前端必须了解的JS中的内存管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • javascript 词法作用域和闭包分析说明

    javascript 词法作用域和闭包分析说明

    以下上是我在学习和使用了JS一段时间后,为了更深入的了解它, 也为了更好的把握对它的应用, 从而在对闭包的学习过程中,自己对于词法作用域的一些理解和总结
    2010-08-08
  • 小程序模实现糊搜索功能

    小程序模实现糊搜索功能

    这篇文章主要为大家详细介绍了小程序模实现糊搜索功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • javascript中的数据类型检测方法详解

    javascript中的数据类型检测方法详解

    这篇文章主要介绍了javascript中的数据类型检测方法,结合实例形式分析了javascript数据类型并总结分析了常见的数据类型检测操作技巧,需要的朋友可以参考下
    2019-08-08
  • 5分钟快速看懂ES6中的反射与代理

    5分钟快速看懂ES6中的反射与代理

    这篇文章主要给大家介绍了如何通过5分钟快速看懂ES6中的反射与代理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ES6具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • javascript操作表格排序实例分析

    javascript操作表格排序实例分析

    这篇文章主要介绍了javascript操作表格排序,涉及javascript数组排序与表格操作的相关技巧,需要的朋友可以参考下
    2015-05-05
  • JS幻想 读取二进制文件

    JS幻想 读取二进制文件

    如果说让JavaScript读取站点上一文本文件,那不过是个再简单不了的事了;但若说要换成一个二进制的文件,并且是完全静态的读取,那似乎有点天方夜谭了。
    2009-04-04

最新评论