1、JS的学习之路-变量

112 阅读4分钟

变量的学习步骤

  1. 什么是变量?
  2. 为什么需要变量?
  3. 怎么声明变量?
  4. 初始化变量(赋值)
  5. 重复声明变量
  6. 变量的作用域
  7. 变量提升
  8. 暂时性死区
  9. 变量命名规则

什么是变量

变量就是一个用于存放数据的容器。而变量名就是这个容器的名字。

JS变量松散类型的本质,决定了变量只是在特定时间用于保存特定值的容器而已。由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变。

所以变量可以保存的是数值、字符串、数组、对象、函数、布尔值等。

⚠️注意:变量不是数据本身,它仅仅是用于存储数据的容器。可以想象为变量就是一个个用来装数据的纸箱,而变量名就是纸箱的名字

为什么需要变量

  1. 存储信息
  2. 为了值的复用

怎么声明变量

想要使用变量,需要做的第一步就是创建它---更准确的说,声明一个变量。声明变量的语法在ES6之前只有var一种声明方式,在ES6新增了letconst。语法就是关键字varletconst之后加上变量的名字

⚠️注意:varlet声明的就是变量,而const声明的是常量

var a
let b
const c = 3

初始化变量(赋值)

当你定义了一个变量,你就能够初始化(赋值)它,方法如下,在变量名之后跟上一个=,然后跟上就是你需要存放的数据

var a = 1
let b = 2
const c = 3

上面的代码表示,varletconst是声明变量的关键字,然后在abc是变量名,1、2、3是值,通过=将变量名与值建立关系。

⚠️注意:这里的=不是数学上的等于的意义,而是赋值的意思。也就是说上面的代码读作将值赋值给变量名。

⚠️注意:varlet声明的变量是可以不赋初始值的,但是const声明的变量必须赋初始值,不然会报错。因为const声明的是常量

var a // 不报错
console.log(a) // undefined
let b // 不报错
console.log(b) // undefined
const c // 报错

重复声明变量

var声明的变量是可以重复声明的,但是letconst声明的变量是不可以重复声明的

var a = 1
var a = 2  // 这里重复声明a不会报错

let b = 1
let b = 1 // 这里重复声明b会报错

const c = 1
const c = 1 // 这里重复声明c会报错

作用域

ES6之前只有全局变量和函数变量,分别对应全局作用域和局部作用域。在函数外声明的变量就是全局变量,函数内声明的变量就是函数变量。但是在ES6新增了块级作用域。所谓块级作用域就是以花括号{}为界限的代码块

var a = 1 // 全局变量-全局作用域
function fun() {
  var a = 1 // 局部变量-局部作用域
}
function fun () {
  let a = 1
  if(true) {
    let a = 2
    console.log(a)
  }
  console.log(a)
}
fun() // 先输出2,再输出1。并不会出现变量覆盖的情况出现

⚠️注意:使用var声明的变量不会存在块级作用域,只有letconst声明的变量才存在块级作用域

变量提升

使用var声明的变量存在变量提升,所谓变量提升就是在一个作用域下不管在任何地方声明的变量都会提升作用域的最顶部。这就造成了在声明变量之前就可以使用变量并且不会报错。

if (true) {
  console.log(a) //这里使用变量a,不会报错。但是也不会有值,所以打印出的是undefined
  var a = 1
}

⚠️注意:letconst声明的变量不存在变量提升。

if (true) {
  console.log(a) //报错
  let a = 1
}
if (true) {
  console.log(a) //报错
  const a = 1
}

暂时性死区

因为letconst不存在变量提升,所以就会造成另一种情况,暂时性死区。使用letconst声明变量之前区域是不能使用该变量,这一区域就叫暂时性死区。

if(true) {
  console.log(tmp) // 报错
  let tmp = 1 // 声明变量tmp之前都是暂时性死区
}

变量命名规则

  1. 变量名一般从(0-9、a-z、A-Z)和下划线中选取
  2. 变量名不能以下划线(_)、数字开头
  3. 一般使用==小驼峰命名法==命名,用多个单词组在一起,第一个单词全部小写,剩下的单词首字母大写(如:myName)
  4. 命名是避免使用JS保留的关键字
  5. 变量名大小写敏感:myname和myName是两个变量名

总结

var let const
变量提升 × ×
全局变量 × ×
重复声明 × ×
重新赋值 ×
暂时性死区 ×
块级作用域 ×
只声明不初始化 × ×