【JavaScript】let和const

let 关键字:声明的变量只在 let 命令所在的代码块内有效

重新定义变量

let 关键字就可以解决这个问题,因为它只在 let 命令所在的代码块 {} 内有效。

var x = 10; 
// 这里输出 x 为 10 
{ 
    let x = 2; 
    // 这里输出 x 为 2 
} 
// 这里输出 x 为 10

使用全局变量

使用 let 关键字声明的全局作用域变量不属于 window 对象:

let carName = "Volvo"; 
// 不能使用 window.carName 访问变量

重置变量

在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var、 let  关键字声明的变量;不能使用 var 关键字来重置 let 关键字声明的变量;

var x = 2;       // 合法
let x = 3;       // 不合法
{
    var x = 4;   // 合法
    let x = 5   // 不合法
}

let x = 2;       // 合法
let x = 3;       // 不合法
{
    let x = 4;   // 合法
    let x = 5;   // 不合法
}

let x = 2;       // 合法
var x = 3;       // 不合法
{
    let x = 4;   // 合法
    var x = 5;   // 不合法
}

let 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的

let x = 2;       // 合法
{
    let x = 3;   // 合法
}
{
    let x = 4;   // 合法
}

const关键字:用于声明一个或多个只读的常量,声明时必须进行初始化,且初始化后值不可再修改

const PI = 3.141592653589793;
PI = 3.14;      // 报错
PI = PI + 10;   // 报错

const定义常量与使用let 定义的变量相似:

  • 二者都是块级作用域
  • 都不能和它所在作用域内的其他变量或函数拥有相同的名称

两者还有以下两点区别:

  • const声明的常量必须初始化,而let声明的变量不用
  • const 定义常量的值不能通过再赋值修改,也不能再次声明。而 let 定义的变量值可以修改。

const 声明的常量必须初始化:

// 错误写法
const PI;
PI = 3.14159265359;

// 正确写法
const PI = 3.14159265359;

并非真正的常量

const 的本质:const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:

// 创建常量对象 
const car = {type:"Fiat", model:"500", color:"white"}; 
// 修改属性
car.color = "red"; 
// 添加属性 
car.owner = "Johnson";

但是我们不能对常量对象重新赋值:

const car = {type:"Fiat", model:"500", color:"white"}; 
car = {type:"Volvo", model:"EX60", color:"red"}; // 错误

以下实例修改常量数组:

// 创建常量数组 
const cars = ["Saab", "Volvo", "BMW"]; 
// 修改元素 
cars[0] = "Toyota"; 
// 添加元素 
cars.push("Audi");
//输出cars:Toyota,Volvo,BMW,Audi

但是我们不能对常量数组重新赋值:

const cars = ["Saab", "Volvo", "BMW"]; 
cars = ["Toyota", "Volvo", "Audi"]; // 错误

重置变量

在相同的作用域或块级作用域中,不能使用 const 关键字来重置 var、let、const 关键字声明的变量:

var x = 2;         // 合法
const x = 2;       // 不合法
{
    let x = 2;     // 合法
    const x = 2;   // 不合法
}

const x = 2;       // 合法
const x = 3;       // 不合法
x = 3;             // 不合法
var x = 3;         // 不合法
let x = 3;         // 不合法
{
    const x = 2;   // 合法
    const x = 3;   // 不合法
    x = 3;         // 不合法
    var x = 3;     // 不合法
    let x = 3;     // 不合法
}

const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:

const x = 2;       // 合法
{
    const x = 3;   // 合法
}
{
    const x = 4;   // 合法
}

const 定义的变量并非不可改变,比如使用const声明对象,可以改变对象值。那么什么情况能彻底“锁死”变量呢?可以使用Object.freeze()方法来 冻结变量 ,如:

// 创建常量数组
const cars = ["Saab", "Volvo", "BMW"];
//冻结变量
Object.freeze(cars)
// 修改元素
cars[0] = "Toyota";
// 显示数组
document.getElementById("demo").innerHTML = cars; 

//输出:Saab,Volvo,BMW

需要注意的是,被冻结后的对象不仅仅是不能修改值,同时也

  1. 不能向这个对象添加新的属性
  2. 不能修改其已有属性的值
  3. 不能删除已有属性
  4. 不能修改该对象已有属性的可枚举性、可配置性、可写性
原文地址:https://www.cnblogs.com/zhaoyl9/p/14661842.html