JavaScript 关键字let和const


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 还在以下场景有区别(可能还有别的):

  1. HTML 中定义变量:var 定义的对象属于 window(能通过 window. 访问),而 let 定义的对象则不属于 window(不能通过 window. 访问);
  2. 重置变量:使用 var 定义的变量在任何地方都可以被 var 重置,而使用 let 定义的变量在相同的作用域中,不能被任何方式重置(可以理解为不能重定义),但在不同的作用域中 let 是可以定义多个相同变量的;
  3. 变量提升:使用 var 定义的变量可以在定义前使用,而使用 let 定义的变量则不能在定义前使用。

稍微总结一下:比起 var 来说 let 更加严格,更加符合 Java 的编程方式,对我比较友好。

关键字 const

这个 const 关键字就是比较有病的东西了。

首先它和众多语言中的 const 一样,用于定义常量,即定义后不能修改的数据:

const owner = "qiyuanc";
owner = "lz"; // 错

const PI;
PI = 3.1415926535; // 错

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

  1. 作用域都是块级,且在相同的作用域内不能重复定义;
  2. 在重置变量和变量提升上,与 let 也相同。

而 const 作为常量,与 let 的不同之处为:

  1. const 定义常量必须初始化,而 let 定义变量不用;
  2. 变量可以修改而常量不行(什么基础)。

但是,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

(0)
上一篇 2022年7月11日
下一篇 2022年7月11日

相关推荐

发表回复

登录后才能评论