0%

JS--变量声明

JS 中变量名全名规则

JS 中变量名中可以使用$,_,数字以及大小写字母,但是数字不能作为开头,大小写敏感

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//正确
var a
var b1
var c$
var $
var _
var $_a
var $123
var a = 123

console.log(A) //ReferenceError 大小写敏感

//错误的变量名
var 1
// 关键字
var break
var new
var a+b
// 保留字
var private

什么是变量提升

  • JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

三种变量声明方式

var

存在变量提升(在声明前使用其值为 undefined)

1
2
3
4
5
console.log(foo) //undefined
var foo = 123
var bar = {}
//隐式全局变量
window.bar === bar //true

const

必须先声明时定义值 定义后值不可变(类似 C 语言指令,指针的指向不可以变,但指向地址的内容可以变)

1
2
3
const foo = {}
//foo = {} //错误,定义后指向不可变
foo.a = '123' //可以这么做,改变的是foo指向的内存地址对应的内容

let

可以先声明后定义,声明后值可变 可以多次改变值

1
2
3
4
let bar
bar = 123
bar = '123'
bar = {}

let/const

都存在块级作用域,不可多次声明,不存在变量提升,在声明前使用会报 ReferenceError(暂时性死区),不会出现隐式全局变量.

  • 不存在变量提升
1
2
3
4
console.log(bar) //错误
console.log(foo) //错误
let bar = 123
const foo = {}
  • 都存在块级作用域
1
2
3
4
5
6
{
let foo = {}
const bar = 123
}
console.log(foo) //错误 存在块级作用域
console.log(bar) //错误 存在块级作用域
  • 不可多次声明
1
2
3
4
5
const bar = 789 //错误 var存在变量提升
var bar = 456
var foo = {}
let foo = 123 //错误

  • 不会出现隐式全局变量
1
2
3
4
5
6
{
let bar = 123
var foo = {}
}
window.foo // {}
window.bar //undefined

动态变量类型

  • 变量的类型没有限制,可以随时变,但值有类型
1
2
3
4
5
var a
a = "123"
typeof a //string
a = 123
typeof a //number

不声明直接使用

1
2
3
4
5
6
7
8
a = 123//会在全局作用域中查找有没有a声明,如果没有就添加
window.a === a //true

//严格模式下报ReferenceError
(function(){
"use strict"
bar = 3 //ReferenceError
})()