文章内容均为个人理解,如有不对,请大佬指正!
var和ES6的let、const有什么区别呢:
1、var声明的变量本身没有块级作用域的概念,可以跨块访问,但是不能跨函数访问,且声明变量的时候会有一个变量提升的过程
2、let、const声明后在同一个块级作用域不能在重复声明,并且在声明之前不能调用这个变量
3、const必需初始化值,且不能被再次赋值(注:基础类型值不能改变,引用类型是可以被改变的)
例子
- 块级作用域
块级作用域是ES6新增的 {}、if和for的{}也有块级作用域
//var
{
console.log(textName); // undefined
var textName = '张三'
}
console.log(textName); // 张三
//let
{
console.log(textAge); //报错 Cannot access 'textAge' before initialization
let textAge = 19
console.log(textAge); //19
let textAge = 20 //报错 Identifier 'textAge' has already been declared
}
console.log(textAge) //报错 textAge is not defined
//const
{
console.log(textAge); //报错 Cannot access 'textAge' before initialization
const textAge = 19
textAge = 15 //报错 Assignment to constant variable.
let textAge //报错 Identifier 'textAge' has already been declared
}
console.log(textAge); //报错 textAge is not defined
- var的变量提升
//声明var变量的时候,有一个变量提升的过程,会把改变量提升到函数顶部(变量提升:这是JavaScript预编译的一个过程)
function text() {
var name = '孙悟空'
if (true) {
var age = 18
}
}
text()
//预编译后
function text() {
var name
var age
name = '孙悟空'
if (true) {
age = 18
}
}
text()
- const:为什么说基础类型值不能改变,引用类型是可以被改变的
//基础类型的值是直接储存在栈内存里面的,
const textName = '小明' //基础类型,值不可改变
textName = '李四' //报错 Assignment to constant variable.
/**
* 引用类型的值并不是直接储存在栈内存,而是在里面储存一个内存地址,内存地址指向堆内存,
* 修改obj.name、obj.sex的时候并没有修改内存地址,只是简单修改了内存地址指向堆内存的值
*/
const obj = {
name: '小美',
age: 19,
sex: '女'
}
console.log(obj); // {name: "小美", age: 19, sex: "女"}
obj.name = '张三'
obj.sex = '男'
console.log(obj); // {name: "张三", age: 19, sex: "男"}