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

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

var与let的区别

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

var 声明存在以下三种问题:

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

举例说明

变量提升

  • var的情况

    javascript 复制代码
    console.log(a); // 输出undefined
    var a = 10;

    解释:var声明的变量会被提升到函数或全局作用域的顶部,但此时变量的值还未被初始化,所以输出undefined

  • let的情况

    javascript 复制代码
    console.log(b); // 报错,ReferenceError: b is not defined
    let b = 20;

    解释:let声明的变量也会被提升,但不会被初始化,处于暂时性死区,所以访问它会报错。

重复声明

  • var的情况

    javascript 复制代码
    var c = 30;
    var c = 40;
    console.log(c); // 输出40

    解释:var声明的变量可以重复声明,后面的声明会覆盖前面的声明。

  • let的情况

    javascript 复制代码
    let d = 50;
    let d = 60; // 报错,SyntaxError: Identifier 'd' has already been declared

    解释:let声明的变量不能重复声明,否则会报错。

作用域

  • var的情况

    javascript 复制代码
    if (true) {
        var e = 70;
    }
    console.log(e); // 输出70

    解释:var声明的变量具有函数作用域或全局作用域,没有块级作用域,所以在if块外部也可以访问到e

  • let的情况

    javascript 复制代码
    if (true) {
        let f = 80;
    }
    console.log(f); // 报错,ReferenceError: f is not defined

    解释:let声明的变量具有块级作用域,在if块外部无法访问到f

全局变量

  • var的情况

    javascript 复制代码
    function g() {
        var h = 90;
    }
    g();
    console.log(h); // 报错,ReferenceError: h is not defined
    javascript 复制代码
    var i = 100;
    console.log(window.i); // 输出100

    解释:在函数内部使用var声明的变量不会成为全局变量。在全局作用域中使用var声明的变量会成为全局对象(如浏览器中的window)的属性。

  • let的情况

    javascript 复制代码
    function j() {
        let k = 110;
    }
    j();
    console.log(k); // 报错,ReferenceError: k is not defined
    javascript 复制代码
    let l = 120;
    console.log(window.l); // 输出undefined

    解释:let声明的变量不会成为全局对象的属性,无论是函数内部还是全局作用域。

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

常量const

概念

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

使用场景

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

命名规范

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

javascript 复制代码
const MAX_VALUE = 100;
const PI = 3.14159;

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

常量使用示例

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

注意事项

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

    javascript 复制代码
    const G = 9.8;
    G = 9.9; // TypeError: Assignment to constant variable.

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

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

    javascript 复制代码
    const G; // SyntaxError: Missing initializer in const declaration
    G = 9.8;

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

小技巧

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

常量与对象属性

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

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

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

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

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

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

相关推荐
豆约翰19 分钟前
phaserjs+typescript游戏开发之camera实现
前端·javascript·typescript
大G哥24 分钟前
记录一次RPC服务有损上线的分析过程
java·开发语言·网络·网络协议·rpc
PorkCanteen1 小时前
Axios 封装:处理重复调用与内容覆盖问题
前端·javascript·http
轻口味1 小时前
Vue.js 父子组件数据传递:props 和事件
前端·javascript·vue.js
im长街1 小时前
4.Proto 3 语法详解
开发语言·学习
迂幵myself1 小时前
13-1类与对象
开发语言·c++·算法
C++小厨神1 小时前
Java语言的软件工程
开发语言·后端·golang
小画家~2 小时前
mac 安装 node
开发语言
lly2024062 小时前
Bootstrap UI 编辑器
开发语言