看 JS 的时候,总感觉这个 JS 有那个大病,说话口齿不清,用起来也莫名其妙的,于是决定记一下。
首先从 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 还在以下场景有区别(可能还有别的):
稍微总结一下:比起 var 来说 let 更加严格,更加符合 Java 的编程方式,对我比较友好。
这个 const 关键字就是比较有病的东西了。
首先它和众多语言中的 const 一样,用于定义常量,即定义后不能修改的数据:
const owner = "qiyuanc"; owner = "lz"; // 错 const PI; PI = 3.1415926535; // 错
使用 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 里的特性和语法都是有够奇怪的。