2024 年 2 月 14 日

变量

大多数情况下,JavaScript 应用程序需要处理信息。以下有两个示例

  1. 在线商店 - 信息可能包括待售商品和购物车。
  2. 聊天应用程序 - 信息可能包括用户、消息等等。

变量用于存储此信息。

变量

变量是数据的“命名存储”。我们可以使用变量来存储商品、访客和其他数据。

要在 JavaScript 中创建变量,请使用 let 关键字。

下面的语句创建(换句话说:声明)一个名为“message”的变量

let message;

现在,我们可以使用赋值运算符 = 向其中放入一些数据

let message;

message = 'Hello'; // store the string 'Hello' in the variable named message

该字符串现在已保存到与该变量关联的内存区域中。我们可以使用变量名访问它

let message;
message = 'Hello!';

alert(message); // shows the variable content

简而言之,我们可以将变量声明和赋值合并到一行中

let message = 'Hello!'; // define the variable and assign the value

alert(message); // Hello!

我们还可以在一行中声明多个变量

let user = 'John', age = 25, message = 'Hello';

这看起来可能更短,但我们不推荐这样做。为了提高可读性,请对每个变量使用一行。

多行变体稍长,但更容易阅读

let user = 'John';
let age = 25;
let message = 'Hello';

有些人还以这种多行样式定义多个变量

let user = 'John',
  age = 25,
  message = 'Hello';

…甚至以“逗号优先”的样式

let user = 'John'
  , age = 25
  , message = 'Hello';

从技术上讲,所有这些变体都执行相同的功能。因此,这取决于个人品味和美学。

var 代替 let

在较旧的脚本中,您还可能会找到另一个关键字:var 代替 let

var message = 'Hello';

var 关键字几乎let 相同。它也声明一个变量,但以一种略有不同的“老派”方式。

letvar 之间存在细微差别,但对我们来说并不重要。我们将在 旧“var” 一章中详细介绍它们。

一个现实生活中的类比

如果我们将变量想象成一个带有唯一名称贴纸的数据“盒子”,我们就可以轻松理解“变量”的概念。

例如,变量 message 可以想象成一个贴有 "message" 标签的盒子,其中包含值 "Hello!"

我们可以在该框中放入任何值。

我们还可以根据需要多次更改它

let message;

message = 'Hello!';

message = 'World!'; // value changed

alert(message);

当值更改时,旧数据将从变量中删除

我们还可以声明两个变量,并将数据从一个变量复制到另一个变量。

let hello = 'Hello world!';

let message;

// copy 'Hello world' from hello into message
message = hello;

// now two variables hold the same data
alert(hello); // Hello world!
alert(message); // Hello world!
两次声明会触发错误

变量只能声明一次。

重复声明同一个变量是一个错误

let message = "This";

// repeated 'let' leads to an error
let message = "That"; // SyntaxError: 'message' has already been declared

因此,我们应该声明一个变量,然后在不使用 let 的情况下引用它。

函数式语言

有趣的是,存在所谓的 纯函数式 编程语言,例如 Haskell,它禁止更改变量值。

在这些语言中,一旦值存储“在框中”,它将永远存在。如果我们需要存储其他内容,该语言会强制我们创建一个新框(声明一个新变量)。我们不能重复使用旧框。

虽然乍一看这可能有点奇怪,但这些语言完全有能力进行严肃的开发。更重要的是,在并行计算等领域,这种限制赋予了某些好处。

变量命名

JavaScript 中的变量名称有两个限制

  1. 名称必须仅包含字母、数字或符号 $_
  2. 第一个字符不能是数字。

有效名称示例

let userName;
let test123;

当名称包含多个单词时,通常使用 驼峰式命名法。即:单词一个接一个,除了第一个单词之外,每个单词都以大写字母开头:myVeryLongName

有趣的是,美元符号 '$' 和下划线 '_' 也可以用于名称中。它们是普通符号,就像字母一样,没有任何特殊含义。

这些名称有效

let $ = 1; // declared a variable with the name "$"
let _ = 2; // and now a variable with the name "_"

alert($ + _); // 3

不正确的变量名称示例

let 1a; // cannot start with a digit

let my-name; // hyphens '-' aren't allowed in the name
大小写很重要

名为 appleAPPLE 的变量是两个不同的变量。

允许使用非拉丁字母,但不推荐

可以使用任何语言,包括西里尔字母、汉字等,如下所示

let имя = '...';
let 我 = '...';

从技术上讲,这里没有错误。此类名称是允许的,但国际惯例是在变量名称中使用英语。即使我们编写的是一个小脚本,它也可能会有很长的生命周期。其他国家的人可能需要在某个时候阅读它。

保留名称

有一个 保留字列表,不能用作变量名称,因为它们被语言本身使用。

例如:letclassreturnfunction 是保留字。

以下代码会产生语法错误

let let = 5; // can't name a variable "let", error!
let return = 5; // also can't name it "return", error!
不使用 use strict 的赋值

通常,我们需要在使用变量之前定义它。但在过去,通过仅赋值而无需使用 let 在技术上可以创建变量。如果我们在脚本中不放入 use strict 以保持与旧脚本的兼容性,现在仍然可以这样做。

// note: no "use strict" in this example

num = 5; // the variable "num" is created if it didn't exist

alert(num); // 5

这是一个不好的做法,并且会在严格模式下导致错误

"use strict";

num = 5; // error: num is not defined

常量

要声明常量(不可变)变量,请使用 const 而不是 let

const myBirthday = '18.04.1982';

使用 const 声明的变量称为“常量”。它们不能重新赋值。尝试这样做会导致错误

const myBirthday = '18.04.1982';

myBirthday = '01.01.2001'; // error, can't reassign the constant!

当程序员确信某个变量永远不会改变时,他们可以使用 const 声明它,以保证并向所有人传达这一事实。

大写常量

广泛的做法是将常量用作别名,用于在执行前已知的难以记住的值。

此类常量使用大写字母和下划线命名。

例如,让我们为颜色创建常量,采用所谓的“Web”(十六进制)格式

const COLOR_RED = "#F00";
const COLOR_GREEN = "#0F0";
const COLOR_BLUE = "#00F";
const COLOR_ORANGE = "#FF7F00";

// ...when we need to pick a color
let color = COLOR_ORANGE;
alert(color); // #FF7F00

优点

  • COLOR_ORANGE"#FF7F00" 更容易记住。
  • 输入 "#FF7F00" 比输入 COLOR_ORANGE 更容易出错。
  • 在阅读代码时,COLOR_ORANGE#FF7F00 更具意义。

我们何时应该对常量使用大写,何时应该正常命名它?让我们阐明这一点。

成为“常量”仅仅意味着变量的值永远不会改变。但有些常量在执行前已知(如红色的十六进制值),而有些常量是在运行时(执行期间)计算出来的,但在其初始赋值后不会改变。

例如

const pageLoadTime = /* time taken by a webpage to load */;

pageLoadTime 的值在页面加载前是未知的,因此它被正常命名。但它仍然是一个常量,因为它在赋值后不会改变。

换句话说,大写命名的常量仅用作“硬编码”值的别名。

正确命名

说到变量,还有一件非常重要的事情。

变量名称应具有清晰、显而易见的意思,描述它存储的数据。

变量命名是编程中最重要的复杂技能之一。只需看一眼变量名称,就可以看出哪段代码是由初学者编写的,哪段代码是由经验丰富的开发人员编写的。

在一个实际项目中,大多数时间都花在修改和扩展现有代码库上,而不是从头开始编写完全独立的东西。当我们在做其他事情一段时间后返回到某些代码时,找到标记良好的信息会容易得多。或者换句话说,当变量具有良好的名称时。

在声明变量之前,请花时间考虑变量的正确名称。这样做将为你带来丰厚的回报。

一些值得遵循的规则是

  • 使用人类可读的名称,如 userNameshoppingCart
  • 除非您知道自己在做什么,否则请远离缩写或短名称,例如abc
  • 使名称尽可能具有描述性且简洁。不良名称的示例是datavalue。此类名称没有任何意义。仅当代码的上下文非常明显地表明变量引用的数据或值时,才可以使用它们。
  • 在您的团队和您的头脑中就术语达成一致。如果网站访问者被称为“用户”,那么我们应该将相关变量命名为currentUsernewUser,而不是currentVisitornewManInTown

听起来很简单?确实如此,但实际上创建描述性且简洁的变量名称并非易事。开始吧。

重用还是创建?

最后一点。有些懒惰的程序员倾向于重用现有变量,而不是声明新变量。

因此,他们的变量就像盒子,人们在里面扔不同的东西,而不改变它们的贴纸。现在盒子里有什么?谁知道?我们需要走近检查一下。

此类程序员在变量声明上节省了一点,但在调试上却损失了十倍。

一个额外的变量是好的,而不是邪恶的。

现代 JavaScript 压缩器和浏览器对代码进行了充分优化,因此不会产生性能问题。对不同的值使用不同的变量甚至可以帮助引擎优化您的代码。

总结

我们可以使用varletconst关键字声明变量来存储数据。

  • let – 是一种现代变量声明。
  • var – 是一种老式的变量声明。通常我们根本不使用它,但我们将在 旧的“var” 一章中介绍与let的细微差别,以防您需要它们。
  • const – 类似于let,但变量的值不能更改。

变量的命名方式应使我们能够轻松理解变量中的内容。

任务

重要性:2
  1. 声明两个变量:adminname
  2. 将值"John"分配给name
  3. name中的值复制到admin
  4. 使用alert显示admin的值(必须输出“John”)。

在下面的代码中,每一行都对应于任务列表中的一个项目。

let admin, name; // can declare two variables at once

name = "John";

admin = name;

alert( admin ); // "John"
重要性:3
  1. 创建一个以我们星球名称命名的变量。您将如何命名这样的变量?
  2. 创建一个变量来存储网站当前访问者的姓名。您将如何命名该变量?

我们星球的变量

很简单

let ourPlanetName = "Earth";

注意,我们可以使用较短的名称planet,但可能无法明确它指的是哪个星球。详细说明会更好。至少在变量isNotTooLong之前是这样。

当前访问者的名称

let currentUserName = "John";

同样,如果我们确定用户是当前用户,我们可以将其缩短为userName

现代编辑器和自动完成功能使编写长变量名称变得容易。不要在这些名称上节省时间。一个包含 3 个单词的名称就可以了。

如果你的编辑器没有适当的自动完成功能,请获取一个新的

重要性:4

检查以下代码

const birthday = '18.04.1982';

const age = someCode(birthday);

这里我们有一个日期常量birthday,还有一个age常量。

age是使用someCode()birthday计算得出的,这意味着一个我们尚未解释的函数调用(我们很快就会解释!),但此处详细信息并不重要,重点是age是根据birthday以某种方式计算得出的。

birthday使用大写是否正确?对age呢?或者甚至对两者都使用大写呢?

const BIRTHDAY = '18.04.1982'; // make birthday uppercase?

const AGE = someCode(BIRTHDAY); // make age uppercase?

我们通常对“硬编码”常量使用大写。或者换句话说,当值在执行之前已知并直接写入代码时。

在此代码中,birthday正是如此。因此,我们可以对它使用大写。

相比之下,age是在运行时计算的。今天我们有一个年龄,一年后我们会有另一个年龄。从某种意义上说,它是常量,因为它不会在代码执行过程中发生变化。但它比birthday“少了一点常量”:它是计算出来的,所以我们应该为它保留小写。

教程地图

评论

在评论之前阅读此内容…
  • 如果你有改进建议,请提交 GitHub 问题或提交拉取请求,而不是评论。
  • 如果您无法理解文章中的某些内容,请详细说明。
  • 要插入几行代码,请使用 <code> 标签,对于多行,请将其包装在 <pre> 标签中,对于超过 10 行,请使用沙盒(plnkrjsbincodepen…)