JavaScript 关键字let和const
看 JS 的时候,总感觉这个 JS 有那个大病,说话口齿不清,用起来也莫名其妙的,于是决定记一下。
关键字 let
首先从 ES6 引入的定义关键字 let 和 const 开始,在这之前,必须提一下没有 let 和 const 之前的 var 关键字。
在 ES6 之前,JavaScript 只有两种作用域:全局变量与函数内的局部变量:
// var 定义全局变量 文件内有效
var id = "qiyuanc";
function getName(){
// 逆天之处 在函数内直接定义的变量 为全局变量
// name = "祈鸢";
// var 定义局部变量 函数内有效
var name = "祈鸢";
return name;
}
ES6 带来了 let 关键字和块级作用域的概念,因此 let 和 var 的区别就很关键了:
var id = "qy";
let name = "祈鸢";
{
// id 被重新定义
var id = "qiyuanc";
// name 没有重新定义 在本块级作用域中 name = "?"
let name = "?";
}
// 此处 id = "qiyuanc"
// 此处 name = "祈鸢"
let 声明的变量只在 let 命令所在的代码块 { } 内有效,在 { } 之外不能访问。
for 循环的条件也属于代码块,因此在 for 循环中使用 let 定义变量,可以达到与 Java 中 for 循环里定义的变量一样的作用域效果。
// 之前使用 var
var i = 5;
for (var i = 0; i < 10; i++) {
// TODO...
}
// 此处 i 为 10
// 现在使用 let
let i = 5;
for (let i = 0; i < 10; i++) {
// TODO...
}
// 此处 i 为 5
除了在块级作用域和循环条件中,var 与 let 还在以下场景有区别(可能还有别的):
- HTML 中定义变量:var 定义的对象属于 window(能通过 window. 访问),而 let 定义的对象则不属于 window(不能通过 window. 访问);
- 重置变量:使用 var 定义的变量在任何地方都可以被 var 重置,而使用 let 定义的变量在相同的作用域中,不能被任何方式重置(可以理解为不能重定义),但在不同的作用域中 let 是可以定义多个相同变量的;
- 变量提升:使用 var 定义的变量可以在定义前使用,而使用 let 定义的变量则不能在定义前使用。
稍微总结一下:比起 var 来说 let 更加严格,更加符合 Java 的编程方式,对我比较友好。
关键字 const
这个 const 关键字就是比较有病的东西了。
首先它和众多语言中的 const 一样,用于定义常量,即定义后不能修改的数据:
const owner = "qiyuanc";
owner = "lz"; // 错
const PI;
PI = 3.1415926535; // 错
使用 const 定义的常量与使用 let 定义的变量类似:
- 作用域都是块级,且在相同的作用域内不能重复定义;
- 在重置变量和变量提升上,与 let 也相同。
而 const 作为常量,与 let 的不同之处为:
- const 定义常量必须初始化,而 let 定义变量不用;
- 变量可以修改而常量不行(什么基础)。
但是,JS 里的这个 const 定义的并非严格意义上的常量,表现在使用 const 定义对象(Array、Map 等也算)时,对象的内容是可变的:
// 创建常量对象
const user = {id:"Qiyuanc", name:"祈鸢", pwd:"123456"};
// 修改属性
user.pwd = "lzlzlz";
// 添加属性
user.money = 9999;
// 但是不能重新辅赋值 错 ↓
user = {id:"Qiyuanb", name:"qyb", pwd:"123456"};
对于数组等而言也是这样:
// 创建常量数组
const users = ["Irror", "Qiyuanc", "Inory"];
// 修改元素
users[0] = "Irror111";
// 添加元素
users.push("Mashiro");
总之,JS 里的特性和语法都是有够奇怪的。
原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/273653.html