ES6(二)—— let 与 const

又来更新学习笔记啦~数组

目录

  • let数据结构

    • 解决var存在的问题
    • 特色闭包

      • 1.有块级做用域
      • 2.全局变量不能用过window(全局对象)访问
      • 3.不能重复声明变量
      • 4.不会进行变量提高
  • const异步

    • 特色学习

      • 1.全部let的属性都有
      • 2.只能定义常量,不能被修改
      • 3.声明时必须初始化
    • 为何const定义对象,其属性能够改变,可是常量不能够?
  • 最佳实践
  • ES6-ES10学习版图

let

解决var存在的问题

let的出现是为了解决一些var存在的问题spa

  1. 同名变量,不在一个做用域,互不影响
// 下面两个i,虽然名字同样,可是不在一个做用域,因此互不影响
for (let i = 0; i < 3; i++) {
    let i = 'foo'
    console.log(i) // foo
}
  1. 解决循环嵌套计数器命名相同混乱的问题
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
  1. 解决计数器循环中有异步变量被改变的问题(解决原理:闭包)
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 = 3
let c = 4
console.log(b, c) // 3,4
console.log(window.b, window.c) //3,undefined
3.不能重复声明变量
var b = 3
let c = 4
console.log(b, c) // 3,4

var b = 4
console.log(b) //4

let 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 = 2
a = 3 //Assignment to constant variable 类型错误
3.声明时必须初始化
const a //Missing initializer in const declaration  声明的时候缺乏初始化
a = 2

为何const定义对象,其属性能够改变,可是常量不能够?

const实际上保证的,并非变量的值不得改动,而是变量指向的那个内存地址不得改动,对于简单类型的数据(数值,字符串,布尔值),值就保存在变量指向的那个内存地址,所以等同于常量。指针

但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针指向的内存地址是固定的,至于它指向的内存地址中保存的数据结构是否是可变的,就彻底不能控制了。所以将一个对象声明为常量要当心。code

最佳实践

不用var,主用const,遇到可变的使用let对象

学习版图