ES6中的let和const常见特性概述

前言

本文仅对开发中常见的情况进行描述。

更为全面的描述,请参考阮一峰出版的《ECMAScript 6 入门》,第二章 let 和 const 命令

全文也参考了这本书。感谢阮一峰大神的无私共享。

let

let用来声明一个变量。其主要特点有:变量不提升、只在声明的代码块里有效、不能重复声明、变量存在暂时性死区。

一下分别对上述3中情况分别讨论:

// 变量不提升

// 例1:
let a = 10
console.log(a)  // => 10

// 例2:
console.log(b)  // => Cannot access 'b' before initialization
let b = 10
// 只在声明的代码块里有效

// 例1:
{
     
  let a = 10
  console.log(a)  // => 10
}

// 例2:
{
     
  let a = 10
}
console.log(a)  // => Uncaught ReferenceError: a is not defined
// 不能重复声明

// 例1:
let a = 10
let a = 11
// => Uncaught SyntaxError: Identifier 'a' has already been declared

// 例2:
let b = 10
console.log(b)  // => 10
{
     
  let b = 11
  console.log(b)  // => 11
}
console.log(b)  // => 10
// 变量存在暂时性死区
// 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响,也不会影响外部的全局变量。

var a = 10
if (true) {
     
  let a = 11
  console.log(a)  // => 11
}
console.log(a)  // => 10

const

const用来声明一个只读的常量,最常见的特性就是声明的内存区域内的内容不能被改变。

分两种情况进行说明:

  1. 简单数据类型

    对于简单数据类型,const在栈内存中存储的是变量的值。

    const a = 10
    const a = 11
    // => Uncaught SyntaxError: Identifier 'a' has already been declared
    // 解析:一旦某块栈内存中存储的值内容发生变化,则会报错。
    
  2. 复杂数据类型

    对于复杂数据类型,const在栈内存中保存一个指针,指向堆内存的某个空间(变量的值保存在这里)。

    const a = [1, 2, 3]
    a.push(4)
    console.log(a) // => [1, 2, 3, 4]
    

    指针不可改变,但是指针指向堆内存中的值可以被改变。

    const a = [1, 2, 3]
    const a = ['a', 'b', 'c']
    // => Uncaught SyntaxError: Identifier 'a' has already been declared
    console.log(b)  // => 改代码不执行
    

你可能感兴趣的:(JavaScript,javascript)