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
需要注意的是,被冻结后的对象不仅仅是不能修改值,同时也
- 不能向这个对象添加新的属性
- 不能修改其已有属性的值
- 不能删除已有属性
- 不能修改该对象已有属性的可枚举性、可配置性、可写性