博客列表 >ES6中let与const的用法以及解构

ES6中let与const的用法以及解构

longlong
longlong原创
2020年09月02日 13:18:08603浏览

1. let的用法

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>let的用法</title>
  7. </head>
  8. <body>
  9. <!-- ul>li{item$}*5 -->
  10. <ul>
  11. <li>item1</li>
  12. <li>item2</li>
  13. <li>item3</li>
  14. <li>item4</li>
  15. <li>item5</li>
  16. </ul>
  17. <script>
  18. // 1. let不支持重复声明,但是支持重复赋值
  19. let str1 = "aaa";
  20. // let str1 = "bbb";
  21. // 上面这个行代码显示 “Identifier 'str1' has already been declared” 这样的报错,表示变量str1已经被使用,即不能重复声明
  22. str1 = "bbb";
  23. console.log(str1); // 输出:bbb
  24. str1 = "ccc";
  25. console.log(str1); // 输出:ccc
  26. // 上面四行代码可以看出,是支持重复赋值的
  27. /*====================================================================================================================*/
  28. // 2. let不存在变量提升,无论是在全局作用域还是函数作用域
  29. // console.log(str2);
  30. // console.log(str2); 这行代码显示这样的报错:Cannot access 'str2' before initialization(不能在初始化以前使用str2)
  31. // 说明在全局作用域下不存在变量声明的提升
  32. let str2 = "hello";
  33. console.log(str2); // 输出:hello
  34. function demo() {
  35. // console.log(str3); Cannot access 'str2' before initialization
  36. let str3 = "world";
  37. console.log(str3);
  38. }
  39. demo(); // 输出: world
  40. // 从上面几行代码,也可以看出在函数作用域下也不支持变量声明提升
  41. /*=====================================================================================================================*/
  42. // 3. let支持块级作用域
  43. if (true) {
  44. let str4 = "didi";
  45. console.log(str4); // 输出:didi
  46. }
  47. // console.log(str4); 输出:str4 is not defined
  48. // 说明在if(){}这个代码块中,str4是有效的,但是在这个块级作用域以外就无效了
  49. // let块级作用域示例
  50. let lis = document.querySelectorAll("li");
  51. for (var i = 0; i < lis.length; i++) {
  52. lis[i].addEventListener("click", function () {
  53. console.log("点击了 item" + (i + 1));
  54. });
  55. }
  56. // 如果for()代码块中是用var声明的变量,最后不管你点击哪个item,都会出现item6,这就是var 不支持块作用域的原因,而且var声明会被提升
  57. // 此案例中var声明会提升到全局,导致addEventListener这个代码块中的 i 不能共享到全局变量,当循环执行完以后,这个 i 就已经变成了 6
  58. // 而let 就不一样,它支持块级作用域,所以每次循环的时候都会形成一个块级作用域,那么addEventListener这个代码块中的 i 就能得到其真实对应的值
  59. for (let i = 0; i < lis.length; i++) {
  60. lis[i].addEventListener("click", function () {
  61. console.log("点击了 item" + (i + 1));
  62. });
  63. }
  64. </script>
  65. </body>
  66. </html>

2. const的用法

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>const的用法</title>
  7. </head>
  8. <body>
  9. <script>
  10. // const声明的是一种特殊变量(只读变量),就是所谓的常量
  11. // 1. const声明的常量必须初始化
  12. // const NAME;
  13. // 报错信息:Missing initializer in const declaration (在const声明中缺少初始化)
  14. const NAME = "jack";
  15. console.log(NAME); // jack
  16. /********************************************************************************************/
  17. // 2. const 也不支持重复声明,并且不能重新赋值
  18. // const NAME = "mike";
  19. // 报错信息:Identifier 'NAME' has already been declared(变量NAME已经被使用了)
  20. // NAME = "mike";
  21. // console.log(NAME);
  22. // 报错信息:Assignment to constant variable (常量类型的变量赋值出错)
  23. /********************************************************************************************/
  24. // 3. const 支持块级作用域
  25. if (true) {
  26. const GENDER = "male";
  27. console.log(GENDER); // male
  28. }
  29. // console.log(GENDER); 报错: GENDER is not defined
  30. </script>
  31. </body>
  32. </html>

3. let 与 const的区别

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>let与const的区别</title>
  7. </head>
  8. <body>
  9. <script>
  10. // let与const的区别:
  11. // 1. 相同之处:都不能重复声明,都支持块级作用域
  12. // 2. 不同之处:let允许重新赋值(更新),而const禁止更新
  13. // 实际开发中可能存在两种风格:
  14. // 1. 全部都用const,除非这个数据后期会有改变
  15. // 2. 可能会更新的或常用的都使用let,除非不会或不太可能被修改的才用const
  16. // 基础上面两点总结:在开发中都尽量使用const会更加严谨,如果出现某个变量报错信息,修改它为let即可
  17. // 有一些数据类型强烈推荐使用const,比如:对象或数组
  18. // 1. 数组
  19. const pics = ["image1", "image2", "image3"];
  20. console.log(pics); // (3) ["image1", "image2", "image3"]
  21. // 对数组中的元素进行增删改查也是没有问题的
  22. pics.push("image4");
  23. console.log(pics); // (4) ["image1", "image2", "image3", "image4"]
  24. pics.splice(3, 2, "image5", "image6");
  25. console.log(pics); // (5) ["image1", "image2", "image3", "image5", "image6"]
  26. // 2. 对象
  27. const obj = {
  28. name: "jack",
  29. age: 21,
  30. email: "jack@qq.com",
  31. };
  32. console.log(obj.age); // 21
  33. console.log(obj.name); // jack
  34. obj.sex = "male";
  35. console.log(obj.sex); // male
  36. // 3. DOM操作时
  37. const h1 = document.createElement("h1");
  38. const body = document.querySelector("body");
  39. h1.innerText = "标题";
  40. h1.style.color = "red";
  41. body.append(h1);
  42. </script>
  43. </body>
  44. </html>

3. 解构

3.1 解构的概述、目的、模型、语法

  • 概述:
    • 解构赋值是对赋值运算符的扩展。
    • 他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
    • 在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取
  • 目的:将集合数据按规则打散到一些独立的变量中
  • 模型:
    • 数组模型解构
    • 对象模型解构
  • 语法:解构变量声明 = 要被解构的数据 (解构表达式)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 1. 数组示例:取出里面的元素分别赋值给变量
  11. const arr = ["num1", "num2", "num3"];
  12. // 传统做法
  13. let num1 = arr[0];
  14. let num2 = arr[1];
  15. let num3 = arr[2];
  16. console.log(num1, num2, num3); // num1 num2 num3
  17. // 使用解构语法
  18. let [n1, n2, n3] = arr;
  19. console.log(n1, n2, n3); // num1 num2 num3
  20. // 2. 对象示例:取出对象中的每个属性
  21. const obj = {
  22. name: "jack",
  23. age: 20,
  24. email: "jack@qq.com",
  25. };
  26. // 传统做法
  27. let personName = obj.name;
  28. let personAge = obj.age;
  29. let personEmail = obj.email;
  30. console.log(personName, personAge, personEmail); // jack 20 jack@qq.com
  31. // 使用解构语法
  32. let { name, age, email } = obj;
  33. console.log(name, age, email); // jack 20 jack@qq.com
  34. // 3. 在书写代码时,可能会直接使用解构语法为数组或对象赋值
  35. let [p1, p2, p3] = ["pic1", "pic2", "pic3"];
  36. console.log(p1, p2, p3); // pic1 pic2 pic3
  37. // 注意点一:解构变量的声明必须初始化
  38. // let [a, b, c];
  39. // 报错信息:Missing initializer in destructuring declaration(解构声明中缺少初始值设定项)
  40. let [a1, a2, a3] = [10, 20, 30];
  41. console.log(a1 + a2 + a3); // 60
  42. // 如果有值未初始化
  43. let [b1, b2, b3] = [10, 20];
  44. console.log(b1 + b2 + b3); // NAN
  45. // 声明的同时赋上默认值
  46. let [c1, c2, c3 = 50] = [10, 20];
  47. console.log(c1 + c2 + c3); // 80
  48. // 通过上面示例:可以理解成,此种书写方式下,左边看成是变量的声明,右边就是根据声明的变量为它赋值
  49. // 注意点二:模板语法
  50. // 解构数组使用 [] , 解构对象使用 {} ,一定要一一对应
  51. // 在解构的过程中,是有两部分在参与,整个过程可以理解为一个解构表达式
  52. // 1. 解构的源就是解构表达式的右边部分
  53. // 2. 解构的目标就是解构表达式的左边部分
  54. </script>
  55. </body>
  56. </html>

3.2 数组模型的解构

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>数组模型的解构</title>
  7. </head>
  8. <body>
  9. <script>
  10. const arr1 = ["name1", "name2", "name3"];
  11. // 1. 解构所有元素
  12. let [name1, name2, name3] = arr1;
  13. console.log(name1, name2, name3); // name1 name2 name3
  14. // 2. 解构部分元素,使用空占位符
  15. let [n1, , n3] = arr1;
  16. console.log(n1, n3); // name1 name3
  17. // 3. 使用解构表达式更新变量
  18. let num1 = 10;
  19. let num2 = 20;
  20. console.log(num1 + num2); // 30
  21. [num1, num2] = [30, 40];
  22. console.log(num1 + num2); // 70
  23. // 4. 解构默认值
  24. const arr2 = ["blue", "green", "yellow"];
  25. let [c1, c2 = "black", c3] = arr2;
  26. console.log(c1, c2, c3); // blue green yellow
  27. let [d1, d2, d3, d4] = arr2;
  28. console.log(d1, d2, d3, d4); // blue green yellow undefined
  29. let [e1, e2, e3, e4 = "black"] = arr2;
  30. console.log(e1, e2, e3, e4); // blue green yellow black
  31. // 变量声明时使用默认值的话,如果数组中有对应的元素,那么会覆盖默认值,如果没有,那么会使用默认值
  32. // 5. 嵌套解构
  33. const arr3 = [1, 2, [3, 4], [[5, 6]], 7, 8];
  34. // 取出所有数字
  35. let [a1, a2, [a3, a4], [[a5, a6]], a7, a8] = arr3;
  36. console.log(a1, a2, a3, a4, a5, a6, a7, a8); // 1 2 3 4 5 6 7 8
  37. // 取出 5 和 6
  38. let [, , [,], [[b5, b6]], ,] = arr3;
  39. console.log(b5, b6); // 5 6
  40. // 6. 函数参数中使用数组解构
  41. function demo([x, y = 30]) {
  42. return x + y;
  43. }
  44. console.log(demo([10, 20])); // 30
  45. console.log(demo([10])); // 40
  46. // 7. 剩余运算符解构
  47. const arr4 = [10, 20, 30, 40, 50];
  48. let [r1, ...r4] = arr4;
  49. console.log(r1, r4); // 10 (4) [20, 30, 40, 50]
  50. // 相当于把后面的参数解析成一个数组r4,let声明中的...r4,表示将数组r4展开,以便获取后面的所有元素,而r4就是保存这些元素的数组
  51. // 8. 解构字符串
  52. let str = " hello world ";
  53. let [s1, s2, s3] = str;
  54. console.log(s1, s2, s3); // h e 因为hello前面有一个空格,所以只得到 h e
  55. let [, , , , , , ...ss] = str.trim(); // 将字符串两边空白去掉
  56. console.log(ss); // (5) ["w", "o", "r", "l", "d"] 获得一个数组
  57. </script>
  58. </body>
  59. </html>

3.3 对象模型的解构

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>对象模型的解构</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 1. 基本解构
  11. const obj1 = { num1: 10, num2: 30 };
  12. let { num1, num2 } = obj1;
  13. console.log(num1, num2); // 10 30
  14. let { n1, n2 } = obj1;
  15. console.log(n1, n2); // undefined undefined
  16. // 解构对象时,变量的声明与对象中的属性名要一致,否则解析不了
  17. // 2. 嵌套解构
  18. const obj2 = {
  19. name: "alice",
  20. age: 20,
  21. score: {
  22. php: 80,
  23. js: {
  24. basis: 90,
  25. advance: 78,
  26. },
  27. },
  28. hobby: {
  29. h1: "book",
  30. h2: "run",
  31. },
  32. };
  33. // 解析对象中的hobby
  34. let { hobby } = obj2;
  35. console.log(hobby); // {h1: "book", h2: "run"}
  36. // 解析scroe-->js-->basis
  37. let {
  38. score: {
  39. js: { basis },
  40. },
  41. } = obj2;
  42. console.log(basis); // 90
  43. // 按照模板将对应的属性名放入声明中就能很好的解析了,仔细一点就不会出错
  44. // 3. 多次解构
  45. // 解构出advance和h2
  46. let {
  47. score: {
  48. js: { advance },
  49. },
  50. hobby: { h2 },
  51. } = obj2;
  52. console.log(advance, h2); // 78 "run"
  53. // 4. 解构声明中可使用变量别名(解决不同对象中出现命名冲突的问题)
  54. const obj3 = {
  55. name: "jack",
  56. age: 30,
  57. };
  58. let { name, age } = obj2; // alice 20
  59. // let { name, age } = obj3; //Identifier 'name' has already been declared,如果变量名之前被使用过,现在就不能再使用了,所以要取别名
  60. console.log(name, age);
  61. let { name: objName, age: objAge } = obj3;
  62. console.log(objName, objAge); // jack 30
  63. // 5. 解构声明中可设置默认值
  64. const obj4 = { a: "hello", b: "world", c: "yes" };
  65. let { a, b, c = "嘿嘿" } = obj4;
  66. console.log(a, b, c); // hello world yes 如果对象中存在对应的值,会覆盖默认值
  67. let { a: obja, b: objb, c: objc, d = "no" } = obj4;
  68. console.log(d); // no 如果对象中不存在对应的值,那么会使用声明中的默认值
  69. // 6. 解构表达式更新变量
  70. let s1 = 10;
  71. let s2 = 20;
  72. console.log(s1 + s2); // 30
  73. ({ s1, s2 } = { s1: 50, s2: 60 });
  74. // 对象解构与数组解构的不同:1. 表达式右边要添加变量名 2. 表达式外层要套上一对小括号()
  75. console.log(s1 + s2); // 110
  76. // 7. 函数参数中使用对象解构
  77. function show({ number1: x, number2: y }) {
  78. console.log(x * y); // 50
  79. y = 6;
  80. console.log(x + y); // 11
  81. }
  82. show({ number1: 5, number2: 10 });
  83. // 如果参数中有默认值,会优先使用参数的值
  84. // 8. 解构剩余参数
  85. const obj5 = {
  86. personName: "tom",
  87. personAge: 18,
  88. personEmail: "tom@qq.com",
  89. personHobby: "book",
  90. };
  91. let { personName, personAge, ...person } = obj5;
  92. console.log(person); // {personEmail: "tom@qq.com", personHobby: "book"}
  93. // 剩余参数会组成一个新的对象
  94. </script>
  95. </body>
  96. </html>
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议