var | let | const |
---|---|---|
1.var声明变量提前 2.var全局作用域 3.var可以重复声明变量 | 1.let没有变量声明提前 2.let代码块内有效 3.let不能重复声明 | 1.不能只定义不,不赋值 2.定义赋值之后,不能修改值 3.定义对象后,可以修改对象内部属性值(保证内存地址不变) |
ES5中我们最常用的就是var来声明变量
1.var
//1.var存在声明提前
//var a
console.log(a);
//a=1
var a = 1
//输出undefined
//2.var存在全局
if (true) {
var c=1
}
console.log(c);
//输出1
//3.var可以重复声明变量
var a = 1
var a = 2
console.log(a);
//输出2
特点:
1.var声明变量提前
2.var全局作用域
3.var可以重复声明变量
ES6中新增加了两个let和const
2.let
//1.let声明变量,没有变量提升
console.log(b);
let b = 1
//2.let代码块内有效
if (true) {
let c = 1
}
console.log(c);
//3.let不能重复声明
let a = 1
let a = 2
console.log(a);
特点:
1.let没有变量声明提前
2.let代码块内有效
3.let不能重复声明
3.const
特点包含了let的前三条
//1.不能只定义不,不赋值
const c
//2.定义赋值之后,不能修改值
const c=1
c=2
//3.定义对象后,可以修改对象内部属性值
const user = { name: 'lzx', age: 21 }
console.log(user);
user.name = '123'
user.age = '123'
console.log(user);
const user = { name: 'lzx', age: 21 }
console.log(user);
user = {
sex: '男'
}
同时自身存在两个特性:
1.不能只定义不,不赋值
2.定义赋值之后,不能修改值
3.定义对象后,可以修改对象内部属性值(保证内存地址不变)
4.经典案例
1.for循环
var arr = []
//var i
//for (i = 0; i < 10; i++) {
for (var i = 0; i < 10; i++) {
arr[i] = function () {
return i
}
}
//arr数组存储了10个函数
console.log(arr[5]());
//输出10
var变量声明提前,当for循环执行结束后,i=10,所以return i的结果都是10
如果用let声明,不存在声明提前
var arr = []
for (let i = 0; i < 10; i++) {
arr[i] = function () {
return i
}
}
console.log(arr[5]());
//输出5
2.不会污染全局变量
var RegExp = 10
console.log(RegExp);
console.log(window.RegExp);
//这里因为var声明变量作用域是全局,所以RegExp=10会存储在window中
//不会污染全局变量
let RegExp = 10
console.log(RegExp);
console.log(window.RegExp);