变量与常量

什么是变量

在计算机语言中,变量是与关联的符号名称(变量名)配对的抽象存储位置,其中包含一些已知或未知数量的数据或对象(称为值);或者更简单地说,变量是特定位组或数据类型的命名容器。该容器中所存储的值是可以修改的。我们通过调用变量名来获取或修改其中的值。

本质: 变量是程序在内存中申请的一块用来存储数据的空间(容器),在不同的时间段里,该空间中存放的内容可能不同。

什么是常量

在计算机编程中,常量是指程序在正常执行过程中不会改变的值,即常量值。当常量与标识符相关联时,常量被称为 “命名常量”,尽管 “常量 “和 “命名常量 “这两个术语经常被交替使用。这与变量形成鲜明对比,变量是一个标识符,其值可在正常执行过程中改变,即值是可变的。
常量也被称之为“字面量”,即所见即所得。
常量包括: 数字常量、字符串常量、布尔常量、自定义常量。

变量的定义与赋值

变量定义就是向计算机申请一块存储数据的内存空间,计算机会分配给我们一个内存地址,我们可以向这块内存地址中存放我们需要的内容。相当于我们申请到一个行李箱的使用权,我们可以向这个箱子里放我们想放的东西,比如:打工人回家时放上给家人带的礼物,从家回打工地时妈妈给你塞满了你喜欢的食物。

ES5 中变量的定义

在 ES6 语法前,我们统一使用 var 关键字来声明一个变量。

1
var hello // 定义一个名为 hello 的变量。

与 C/C++/Java 等强类型语言不同,javascript 是弱类型语言,所以所有类型的变量都可以使用 var来定义。

ES6 中变量的定义

ES6 语法中新增了 letconst 关键字来替代 var(依然可以使用)。

  • const: 定义一个常量,确定数据不会变更时使用该关键定定义。
  • let: 定义一个变量,当数据会发生变更时使用该关键字来定义。
1
2
const hello; // 定义一个常量
const world; // 定义一个变量

变量赋值与初始化

变量的第一次赋值被称为变量的初始化,一个变量在没初始化(只声明,未赋值)前,其变量值为 undefined,变量的初始化有两种形式:

  • 直接赋值: 声明变量的同时给变量赋予初始值。
  • 先定义后赋值: 先声明变量,在合适的位置给变量赋值。
直接赋值

声明变量的同时,给变更赋予初始值。如果使用 const 定义,则只能通过该方式赋值,赋值后无法再次更改变量(修改值时会报错)。

1
2
3
4
5
6
7
8
let hello = 'hello'
const world = 'world'
console.log(hello, world)

hello = 'hi' // 二次赋值不再是初始化
console.log(hello)

world = 'moon' // TypeError: Assignment to constant variable.
先定义后赋值
1
2
3
4
5
6
7
let hello
hello = 'hello'

var world
world = 'world'

console.log(hello, world)
修改变量值

修改变量的值即给已经初始化过的变量赋予新的值,变量被重新赋值后,其原有的值会被覆盖,变量值以最后一次赋值为准。如:

1
2
3
let a = 10
a = 100
console.log(a) // 100

同时定义多个变量

如果有多个变量需要被定义时,可以使用一个关键字来定义所有变量,多个变量名之间使用 英文逗号,分隔即可。

1
2
3
let a, b, c

console.log(a, b, c) // undefined undefined undefined

如果变量在声明时变可以确定其值,可直接进行初始化。

1
2
3
4
let a = 1,
b = 2,
c = 3
console.log(a, b, c) // 1 2 3

若要声明的变量值都相等,可以通过连等的形式来声明(不推荐)。

1
2
let a = (b = c = 3)
console.log(a, b, c) // 3 3 3

若在声明时只有部分变量可以确定其值,部分变量暂无法确定其值。

1
2
3
4
let a,
b = 2,
c = 3
console.log(a, b, c) // undefined 2 3

若变量被重复定义,使用 letconstvar 表现不同。

1
2
3
4
5
6
7
8
9
let a = 1
let a = 2 // SyntaxError: Identifier 'a' has already been declared。无法编译通过

const b = 1
const b = 2 // SyntaxError: Identifier 'b' has already been declared。 无法编译通过

var c = 1
var c = 2
console.log(c) // 2

若不使用关键定直接为变量赋值时,变量也可以被定义。

1
2
a = 100
console.log(a) // 100

若不声明且不赋值直接使用变量,则运行时会报错。

1
console.log(a) // ReferenceError: a is not defined

总结

  • 在 ES5 中,我们使用 var 来声明变量,也可以不声明变量直接赋值,赋值后变量也可使用。
  • 在 ES6 中,我们使用 letvar 来声明变量,使用 const 来声明常量,也可以不声明变量直接赋值,赋值后变量也可使用。
  • 变量的第一次赋值被称为变量的初始化。
  • const 定义常量时,需要同时初始化,否则无法编译通过。
  • const 定义的常量无法被修改,修改无法编译通过。
  • letconstvar 在使用上会有一些差别。

其他差别请查看认识关键字 var/let/const