又来更新学习笔记啦~
目录
let
- 解决var存在的问题
特点
- 1.有块级作用域
- 2.全局变量不能用过window(全局对象)拜访
- 3.不能反复申明变量
- 4.不会进行变量晋升
const
特点
- 1.所有let的属性都有
- 2.只能定义常量,不能被批改
- 3.申明时必须初始化
- 为什么const定义对象,其属性能够扭转,然而常量不能够?
- 最佳实际
- ES6-ES10学习幅员
let
解决var存在的问题
let的呈现是为了解决一些var存在的问题
- 同名变量,不在一个作用域,互不影响
// 上面两个i,尽管名字一样,然而不在一个作用域,所以互不影响for (let i = 0; i < 3; i++) { let i = 'foo' console.log(i) // foo}
- 解决循环嵌套计数器命名雷同凌乱的问题
const arr = [1, 2, 3, 4]for(let i = 0; i < 3; i++) { for(let i = 0; i < 4 ; i++) { console.log(arr[i]) }}// 1 2 3 4 1 2 3 4 1 2 3 4
- 解决计数器循环中有异步变量被扭转的问题(解决原理:闭包)
for (var i = 0; i < 3; i++) { setTimeout(() => { console.log(i) }, 0)}// 输入三个3
特点
1.有块级作用域
{ let a = 1 console.log(a)}console.log(a) //a is not defined
2.全局变量不能用过window(全局对象)拜访
var b = 3let c = 4console.log(b, c) // 3,4console.log(window.b, window.c) //3,undefined
3.不能反复申明变量
var b = 3let c = 4console.log(b, c) // 3,4var b = 4console.log(b) //4let c = 5 // Identifier 'c' has already been declared c曾经被申明console.log(c)
4.不会进行变量晋升
function test() { console.log(a) let a = 1}test() // Cannot access 'a' before initialization 不能在初始化之前调用
const
特点
1.所有let的属性都有
2.只能定义常量,不能被批改
cosnt a = 2a = 3 //Assignment to constant variable 类型谬误
3.申明时必须初始化
const a //Missing initializer in const declaration 申明的时候短少初始化a = 2
为什么const定义对象,其属性能够扭转,然而常量不能够?
const实际上保障的,并不是变量的值不得改变,而是变量指向的那个内存地址不得改变,对于简略类型的数据(数值,字符串,布尔值),值就保留在变量指向的那个内存地址,因而等同于常量。
但对于复合类型的数据(次要是对象和数组),变量指向的内存地址,保留的只是一个指针,const只能保障这个指针指向的内存地址是固定的,至于它指向的内存地址中保留的数据结构是不是可变的,就齐全不能管制了。因而将一个对象申明为常量要小心。
最佳实际
不必var,主用const,遇到可变的应用let