一、ES6的基础语法

1. let / const

ES6中新增的用来创建变量和常量的

  1. let a = 12;
  2. a = 13;
  3. console.log(a); // 13
  4. const b = 12;
  5. b = 13; // Uncaught TypeError: Assignment to constant variable. 基于 CONST 创建变量,变量存储的值不能被修改(常量)
  6. console.log(b);

let 和 var 的区别

  • let 不存在变量提升(当前作用域中,不能在 let 声明前使用变量)
  • 同一个作用域中,let 不允许重复声明
  • let解决了 typeof 的一个暂时性死区问题
  • 全局作用域中,使用 let 声明的变量并没有给 window 加上对应的属性
  • let会存在块作用域(除对象以外的大括号都可被看做块级私有作用域)

2. 箭头函数及THIS问题

ES6中新增了创建函数的方式:“箭头函数” 真实项目中是箭头函数和 FUNCTION 这种普通函数混合使用 箭头函数简化了创建函数的代码

  1. // 箭头函数的创建都是函数表达式方式(变量=函数),这种模式下,不存在变量提升,函数只能在创建完成后被执行(也就是创建的代码之后执行)
  2. const fn = ([形参]) => {
  3. // 函数体 (return)
  4. };
  5. fn([实参]);
  6. // 形参只有一个,小括号可以不加
  7. const fn = n => {};
  8. // 函数体中只有一句话,并且是 return xxx 的,可以省略大括号和 return 等
  9. const fn = n => n * 10;
  10. /*
  11. function fn(n){
  12. return function(m){
  13. return m+(++n);
  14. }
  15. }
  16. */
  17. const fn=n=>m=>m+(++n);

箭头函数中没有 ARGUMENTS,但是可以基于剩余运算符获取实参集合,而且 ES6 中是支持给形参设置默认值的

  1. let obj = {};
  2. let fn = (context = window, ...args) => {
  3. // console.log(arguments); // Uncaught ReferenceError: arguments is not defined 箭头函数中没有 arguments
  4. // ...args:剩余运算符(把除第一项外的,其它传递的实参信息都存储到 ARGS 这个数组集合中)
  5. console.log(args);
  6. };
  7. fn(obj, 10, 20, 30); // context:obj arg:[10,20,30]
  8. fn(); // context:window arg:[]

箭头函数中没有自己的 THIS,它里面用到的 THIS,都是自己所处上下文中的 THIS(真实项目中,一但涉及THIS 问题,箭头函数慎用)

  1. window.name = "WINDOW";
  2. let fn = n => {
  3. console.log(this.name);
  4. };
  5. let obj = {
  6. name: 'OBJ',
  7. fn: fn
  8. };
  9. // FN 所处的执行上下文中的 THIS 是 WINDOW
  10. fn(10); // this:window
  11. fn.call(obj, 10); // this:window 不是我们预期的 OBJ
  12. document.body.onclick = fn; // this:window 不是我们预期的 BODY
  13. obj.fn(10); // this:window
  1. let obj = {
  2. name: 'OBJ',
  3. fn: function () {
  4. // this:obj 普通函数是有自己的 THIS 的
  5. let f = () => {
  6. console.log(this);
  7. };
  8. f(); // this:obj
  9. return f;
  10. }
  11. };
  12. let f = obj.fn();
  13. f(); // this:obj

真实项目中的一个应用

  1. let obj = {
  2. name: 'OBJ',
  3. fn: function () {
  4. // this:obj
  5. // 原本期望的需求是:1S 后把 OBJ 中的 NAME 改为'珠峰'
  6. setTimeout(() => {
  7. console.log(this); // OBJ
  8. this.name = '珠峰';
  9. }, 1000);
  10. /* setTimeout(function () {
  11. console.log(this);// WINODOW
  12. this.name = '珠峰';
  13. }, 1000); */
  14. /* let _this = this; // 把需要的 THIS 提前用变量存储起来
  15. setTimeout(function () {
  16. _this.name = '珠峰'; // 需要使用的时候拿出来用即可
  17. }, 1000); */
  18. }
  19. };
  20. obj.fn();

二、解构赋值

  1. // 让左侧出现和右侧相同的数据,彼此快速获取到我们需要的内容
  2. // 真实项目中最常用的就是对数组和对象的解构赋值
  3. /*let obj = {
  4. name: '马宾',
  5. age: 18,
  6. title: '宇宙集团军总司令'
  7. };*/
  8. // let name = obj.name;
  9. // let age = obj.age;
  10. // let title = obj.title;
  11. // let { name, age, title } = obj;
  12. // // console.log(name, age, title);
  13. // let ary = ['JS', 'HTML', 'CSS', 'NODEJS', 'MYSQL'];
  14. // let js = ary[0];
  15. // let html = ary[1];
  16. // let [js, html, css, node, mysql] = ary;
  17. // // console.log(js, html, css, node, mysql);
  18. // 解构赋值:利用数据结构,快速对对象和数组进行取值;(ES6 新增的)
  19. // 1. 数组的解构赋值:
  20. let ary = [1, 2, 3, 4];
  21. // 1.1 顺序解构
  22. let [a, b, c, d] = ary; // 等号左边是变量,等号右边是数组,左边的变量要求和你想取的数组中的值位置对应
  23. // console.log(a, b, c, d);
  24. // 1.2 只取数组中的某一个,如取第三个,前面写两个逗号
  25. let [,,e] = ary;
  26. // console.log(e);
  27. // 1.3 进一步解构: 取 ary2中 'a' 'b'
  28. let ary2 = [1, ['a', 'b']];
  29. let [f, [g, h]] = ary2;
  30. // console.log(g, h);
  31. // 1.4 取出第一项和第二项,把剩下的放到一个数组中;
  32. let ary3 = [1, 3, 5, 7, 9];
  33. let [i, j, ...k] = ary3; // k 的后面不能再解构了,再解构就会报错
  34. // console.log(i);
  35. // console.log(j);
  36. // console.log(k);
  37. // 1.5 数组解构时的默认值: 当解构到的值是 undefined 时(解构到的值是 undefined,另一种就是没有解构到值),就会使用默认值
  38. let ary4 = [2, 4, 6, undefined];
  39. let [l, m, n, o = 'hahaha'] = ary4; // 给 o 设置解构的默认值
  40. // console.log(l, m, n, o);
  41. // 用p当q的默认值
  42. let [p, q = p] = [1];
  43. // console.log(p, q);
  44. // let [r = s, s] = [undefined, 3]; 报错:当 r 解构出 undefined 时,要使用s的值做默认值,但是 s 没声明过,就会报错;当解构变量互为默认值时,注意!
  45. // // console.log(r, s);
  46. // 对象的解构赋值
  47. // 通常情况下我们使用对象.属性名 或者 对象['属性名'] 取得该属性名对应的属性值;
  48. // 对象的解构赋值:利用变量名和对象的属性名同名时就可以取得对象该属性的值,和顺序无关。
  49. let obj = {
  50. name: '马宾',
  51. age: 18,
  52. title: '宇宙集团军总司令'
  53. };
  54. let { name, title, age } = obj;
  55. // console.log(name, title, age);
  56. // 1. 只想取一个值,比如取 courses;对象解构赋值,你想取哪个就写哪个。
  57. let zf = {
  58. name: '珠峰',
  59. age: 10,
  60. courses: ['JS', 'UI', 'Architect']
  61. };
  62. let { courses } = zf;
  63. // console.log(courses);
  64. // 2. 进一步解构,解构 t_name 的值;
  65. let zf2 = {
  66. name: '珠峰',
  67. age: 10,
  68. characters: {
  69. teacher: {
  70. t_name: 'mabin',
  71. t_age: 18
  72. }
  73. }
  74. };
  75. let {characters: {teacher: {t_name}}} = zf2;
  76. // console.log(t_name);
  77. // 3. 重命名:防止和其他变量命名冲突;
  78. let job = 'FE';
  79. let obj4 = {
  80. name: '马宾',
  81. job: 'teacher'
  82. };
  83. let { job: job2 } = obj4; // 从 obj4 中解构 job 属性,并且重命名为 job2
  84. // console.log(job2);
  85. // 4. 对象解构的默认值: 当解构出来的值是 undefined,默认值才会生效
  86. let obj5 = {
  87. name: '珠峰'
  88. };
  89. let {name: name2, address = '北京昌平'} = obj5;
  90. // console.log(name2);
  91. // console.log(address);
  92. // 解构字符串:字符串的解构依赖位置
  93. let [x, y, z] = 'HELLO';
  94. // console.log(x, y, z);
  95. // 函数的参数解构
  96. /*
  97. // 原来是在函数中对 obj 解构
  98. function reg(obj) {
  99. let {name, age} = obj;
  100. }
  101. reg({
  102. name: '珠峰',
  103. age: 10
  104. });*/
  105. function reg({name = 'zhufeng', age = 10}) {
  106. // 在函数形参位置解构函数执行时传递进来的实参
  107. // console.log(name, age);
  108. }
  109. reg({
  110. name: '珠峰'
  111. });
  112. function getAry([x, y, z]) {
  113. console.log(x, y, z);
  114. }
  115. getAry(['a', 'b', 'c']);
  116. // 对象的简洁语法:ES6
  117. let config = '110.179.23.123';
  118. let pwd = '@#4ghjkl099';
  119. let obj6 = {
  120. config: config,
  121. pwd: pwd
  122. };
  123. // 当对象属性名和变量名同名时,在对象中只写一个变量名就可以了
  124. let obj7 = {
  125. config, // config: config
  126. pwd // pwd: pwd
  127. };
  128. console.log(obj6);
  129. console.log(obj7);