• JavaScript 中的变量声明与赋值


    3.10 JavaScript 中的变量声明与赋值。

    在计算机编程中,使用名称(或标识符)来表示值是最基本的技术之一。将名称与值绑定为我们提供了一种在程序中引用值并利用它们的方式。当涉及到绑定名称与值时,我们通常称之为将值赋给变量。术语“变量”暗示了新的值可以被赋给它,这意味着与变量关联的值在程序执行过程中可能会改变。如果一个值被永久地分配给一个名称,那么该名称可以被视为常量而不是变量。

    在 JavaScript 中使用变量或常量之前,必须先进行声明。在 ES6 版本及更高版本的 JavaScript 中,可以使用 letconst 关键字来实现这一点,我们将在稍后介绍。在 ES6 之前,变量使用 var 关键字进行声明。

    1. 使用 letconst 进行声明。

    在现代 JavaScript(ES6 及更高版本)中,变量使用 let 关键字进行声明:

    let i;
    let sum;
    
    • 1
    • 2

    也可以在单个 let 语句中声明多个变量:

    let i, sum;
    
    • 1

    在声明时,最好将初始值赋给变量(如果可能的话):

    let message = "hello";
    let i = 0, j = 0, k = 0;
    // 初始化语句可以使用先前声明的变量
    let x = 2, y = x * x;
    
    • 1
    • 2
    • 3
    • 4

    如果在 let 语句中没有提供初始值,变量仍将被声明,但其值将是 undefined,直到它被赋值。要声明常量而不是变量,请使用 const 关键字而不是 letconst 类似于 let,但关键区别在于常量在声明时必须进行初始化:

    // 哈勃常数(km/s/Mpc)
    const H0 = 74;
    // 真空中的光速(km/s)
    const C = 299792.458;
    // 天文单位:地球和太阳之间的平均距离(km)
    const AU = 1.496E8;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    正如名称所示,常量的值不能被更改,尝试重新分配常量会导致 TypeError。声明常量的通用(尽管不是普遍的)约定是使用大写字母,例如 H0HTTP_NOT_FOUND,以将它们与变量区分开。

    何时使用 const

    在使用 const 关键字方面存在两种观点。一个观点是仅在预期值不会更改的情况下使用 const,例如物理常数、程序版本号或用于识别文件类型的字节顺序标记。另一个观点认为,在程序中,许多所谓的变量实际上在运行时并不会改变。因此,建议是使用 const 来声明所有变量,仅在发现需要允许它们的值发生变化时将其切换为 let。这种方法有助于避免意外的变量修改,从而导致错误。

    在第一种情况下,const 仅用于必须保持恒定的值。在第二种情况下,const 用于任何不会更改的值。就个人而言,在编写代码时,我更倾向于前一种方法。

    JavaScript 中的循环结构:forfor/infor/of 循环。

    在 JavaScript 中,循环结构(如 forfor/infor/of 循环)包括一个在循环的每次迭代中获取新值的循环变量。JavaScript 允许在循环语法中声明这个循环变量,这是 let 的另一个常见用例:

    for (let i = 0, len = data.length; i < len; i++) console.log(data[i]);
    for (let datum of data) console.log(datum);
    for (let property in object) console.log(property);
    
    • 1
    • 2
    • 3

    虽然可能看起来有点不寻常,但也可以在 for/infor/of 循环中使用 const 来声明循环的“变量”,只要它们在循环体内部不被重新赋值。在这种情况下,const 声明表示循环变量的值在每次迭代中都是恒定的:

    for (const datum of data) console.log(datum);
    for (const property in object) console.log(property);
    
    • 1
    • 2

    变量和常量的作用域。

    变量的作用域是指在源代码中定义变量的区域。使用 letconst 声明的变量和常量具有块级作用域。这意味着它们仅在 letconst 语句的代码块内部定义。JavaScript 类和函数的函数体被视为代码块,同样,if/else 语句的语句体和 whilefor 循环的循环体也被视为代码块。简单来说,如果变量或常量声明在一对花括号内部,那么这些花括号限制了变量或常量定义的代码区域(当然,在引用这些变量或常量之前的代码行中引用在 letconst 语句中声明它们是无效的)。作为 forfor/infor/of 循环的一部分声明的变量和常量的作用域仅限于循环体, 即使循环声明位于花括号外部。

    如果声明发生在顶层,在任何代码块之外,它被称为全局变量或常量,并具有全局作用域。在 Node 和客户端 JavaScript 模块中,全局变量的作用域由声明它们的文件决定。但是,在传统的客户端 JavaScript 中,全局变量的作用域由声明它们的 HTML 文档决定。换句话说,如果