当前位置: 首页 > news >正文

js基础---var与let的区别以及const的使用

js基础—var与let的区别以及const的使用

var与let的区别

在较旧的JavaScript,使用关键字var来声明变量,而不是let。var现在开发中一般不再使用它,只是我们可能再老版程序中看到它。let的出现为了解决var的一些问题。
var 声明存在以下三种问题:

  • 可以先使用在声明 (不合理)
  • var声明过的变量可以重复声明(不合理)
  • 比如变量提升、全局变量、没有块级作用域等等

举例说明

变量提升

  • var的情况
    console.log(a); // 输出undefined
    var a = 10;
    
    解释:var声明的变量会被提升到函数或全局作用域的顶部,但此时变量的值还未被初始化,所以输出undefined
  • let的情况
    console.log(b); // 报错,ReferenceError: b is not defined
    let b = 20;
    
    解释:let声明的变量也会被提升,但不会被初始化,处于暂时性死区,所以访问它会报错。

重复声明

  • var的情况
    var c = 30;
    var c = 40;
    console.log(c); // 输出40
    
    解释:var声明的变量可以重复声明,后面的声明会覆盖前面的声明。
  • let的情况
    let d = 50;
    let d = 60; // 报错,SyntaxError: Identifier 'd' has already been declared
    
    解释:let声明的变量不能重复声明,否则会报错。

作用域

  • var的情况
    if (true) {var e = 70;
    }
    console.log(e); // 输出70
    
    解释:var声明的变量具有函数作用域或全局作用域,没有块级作用域,所以在if块外部也可以访问到e
  • let的情况
    if (true) {let f = 80;
    }
    console.log(f); // 报错,ReferenceError: f is not defined
    
    解释:let声明的变量具有块级作用域,在if块外部无法访问到f

全局变量

  • var的情况
    function g() {var h = 90;
    }
    g();
    console.log(h); // 报错,ReferenceError: h is not defined
    
    var i = 100;
    console.log(window.i); // 输出100
    
    解释:在函数内部使用var声明的变量不会成为全局变量。在全局作用域中使用var声明的变量会成为全局对象(如浏览器中的window)的属性。
  • let的情况
    function j() {let k = 110;
    }
    j();
    console.log(k); // 报错,ReferenceError: k is not defined
    
    let l = 120;
    console.log(window.l); // 输出undefined
    
    解释:let声明的变量不会成为全局对象的属性,无论是函数内部还是全局作用域。

var确实存在一些问题,如变量提升可能导致的逻辑错误、重复声明带来的混淆以及缺乏块级作用域等。在现代JavaScript开发中,推荐使用let来声明变量,以避免这些问题,提高代码的可读性和可维护性。

常量const

概念

使用const声明的变量称为“常量”。常量与变量的主要区别在于,常量一旦被赋值后,其值就不能再被改变。这使得常量在程序中具有稳定性和可预测性,有助于减少因意外修改而导致的错误。

使用场景

当某个变量的值在程序的整个生命周期中都不会改变时,就可以使用const来声明。例如,一些数学常数、配置参数、枚举值等都可以使用const声明。使用const声明常量可以明确地表达出该值不应当被修改的意图,同时也能够让阅读代码的人更容易理解代码的意图。

命名规范

常量的命名规范与变量基本一致,但有一些细微的差别。通常情况下,常量的名称使用大写字母,单词之间用下划线连接,以突出其常量的特性。例如:

const MAX_VALUE = 100;
const PI = 3.14159;

这种命名方式可以让开发者在阅读代码时,能够快速识别出这是一个常量,而不是一个普通变量。

常量使用示例

// 声明一个常量
const G = 9.8;
// 输出这个常量
console.log(G);

注意事项

  1. 不允许重新赋值:常量一旦被赋值后,就不能再被重新赋值。如果尝试对常量重新赋值,将会导致语法错误。例如:

    const G = 9.8;
    G = 9.9; // TypeError: Assignment to constant variable.
    

    这一特性确保了常量的值在程序运行过程中始终保持不变。

  2. 声明时必须赋值(初始化):使用const声明常量时,必须在声明的同时进行初始化赋值。不能先声明常量,然后再赋值。例如:

    const G; // SyntaxError: Missing initializer in const declaration
    G = 9.8;
    

    这是因为const声明的常量必须有一个明确的初始值,以保证其在整个作用域内的值都是确定的。

小技巧

对于不需要重新赋值的数据,使用const是一个很好的选择。这不仅可以避免意外修改数据,还可以提高代码的可读性和可维护性。在实际开发中,养成使用const的习惯,可以让你的代码更加健壮和清晰。

常量与对象属性

需要注意的是,虽然使用const声明的对象本身不能被重新赋值,但对象的属性是可以被修改的。例如:

const obj = { name: 'Kimi', age: 20 };
obj.name = 'Moonshot'; // 合法操作,修改对象属性
console.log(obj); // 输出 { name: 'Moonshot', age: 20 }

这是因为const只是保证了变量指向的对象引用不能改变,而不是对象内部的属性不能改变。如果需要保证对象的属性也不被修改,可以使用Object.freeze()方法来冻结对象,使其成为不可变对象。例如:

const obj = { name: 'Kimi', age: 20 };
Object.freeze(obj);
obj.name = 'Moonshot'; // 不会改变对象属性,因为对象被冻结了
console.log(obj); // 输出 { name: 'Kimi', age: 20 }

通过这种方式,可以确保对象及其属性在整个程序中都不会被修改,从而实现更严格的数据保护。

总之,合理使用const声明常量,可以在很大程度上提高代码的质量和稳定性。在编写JavaScript代码时,建议尽可能多地使用const来声明那些不需要改变的值。

http://www.lryc.cn/news/520891.html

相关文章:

  • 用css和html制作太极图
  • OJ12:160. 相交链表
  • 软件工程和项目管理领域 - CMMI 极简理解
  • C# 线程基础之 线程同步
  • [c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
  • RocketMQ 知识速览
  • 优化 Azure Synapse Dedicated SQL Pool中的 SQL 执行性能的经验方法
  • 详解英语单词“pro bono”:公益服务的表达(中英双语)
  • 16. C语言 字符串详解
  • 使用Buildroot开始嵌入式Linux系统之旅-3
  • [免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】
  • 【已解决】【记录】2AI大模型web UI使用tips 本地
  • 44.ComboBox的数据绑定 C#例子 WPF例子
  • 物联网之传感器技术
  • QTreeWidget QTreeWidgetItem
  • torch.einsum计算张量的外积
  • PostgreSQL 超级管理员详解
  • RabbitMQ 工作模式使用案例之(发布订阅模式、路由模式、通配符模式)
  • 【2024年华为OD机试】(C卷,100分)- 机场航班调度程序 (Java JS PythonC/C++)
  • Vue.js组件开发-使用地图绘制轨迹
  • vue 与 vue-json-viewer 实现 JSON 数据可视化
  • ubuntu Android : adb logcat 过滤多个log
  • kubeneters-循序渐进Cilium网络(三)
  • 编译与汇编
  • 对MySQL滴MVCC理解(超详细)
  • Mac玩Steam游戏秘籍!
  • matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题
  • 电商项目-基于ElasticSearch实现商品搜索功能(三)
  • 【Vim Masterclass 笔记12】S06L26 + L27:Vim 文本的搜索、查找及替换同步练习(含点评课)
  • Jsoup实现实时爬取