变量:用来存储数据的“容器”;
规则---- 不能用关键字(含特殊含义的字符);只能用下划线、字母、数字、$组成,且数字不能开头;字母严格区分大小写;
规范---- 起名要有意义;遵循小驼峰命名法;
三者区别:
1、块级作用域
块级作用域由 {} 包括,let和const 具有块级作用域,var不存在块级作用域。
块级作用域解决了ES5中的两个问题:
* 内层变量可能覆盖外层变量
* 用来计数的循环变量泄漏为全局变量
2、变量提升 (可先使用再声明,不合理)
var存在变量提升,let和const 不存在变量提升,即变量只能申明之后使用,否则会报错。
console.log(a) //undefined
var a = 1
3、给全局添加属性
浏览器的全局对象时 window ,Node的全局对象时 global。var声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是,let和 const 不会。
var myage = 100
console.log(window.myage) // 100
let age = 100
console.log(window.age) //undefined 不与顶层对象挂钩
const age = 100
console.log(window.age) //undefined
4、重复声明 (bug,不合理)
var 可以重复声明变量,后声明的同名变量会覆盖之前声明的变量,const和let 不允许。
var a = 1
var a = 2
console.log(a) //2
5、暂时性死区
在使用 let 和const 命令声明变量之前,该变量都是不可用的,这在语法上,称为暂时性死区。使用var 声明的变量不存在暂时性死区。
let myname = "lxx"
function test(){ //区域内形成 暂时性死区
console.log(myname)
let myname = "linsir"
}
test() //报错
let myname = "lxx"
function test(){
console.log(myname)
}
test() // lxx
6、初始值设置
在变量声明时,var和 let 可以不用设置初始值,而const 声明变量必须设置初始值(不能被修改)。
如果const变量引用的是一个对象或数组,那么修改这个对象内部的属性并不违反const的限制。
在现在开发中,数组/对象的声明通常用const
const per = {}
per.myname = "linsir"
7、指针指向
let 和 const 都是ES6新增的 用于创建变量的语法。Let创建的变量是可以更改指针指向(即重新赋值),但const 声明的变量不允许改变指针的指向。
例如:不能用const来声明迭代变量(迭代变量会自增)。不过可以声明不被修改的for循环变量。
for (const i = 0; i < 4; i++){} // TypeError: Assignment to constant variable
for (const j of [1, 2, 3, 4]) {
console.log(j); // 1 2 3 4
}