• 初识ES6


    1. let 与 const

    • var:ES5中用于声明变量的关键字,存在各种问题,例如
      1. // 1.声明提升
      2. console.log(name);
      3. var name = "哈哈";
      4. // 2. 变量覆盖,发生变量覆盖可能会导致数据丢失以及各种不可预知的bug
      5. var demo = "小明";
      6. var demo = "小红";
      7. console.log(demo)//小红
      8. // 3. 没有块级作用域,i是定义在循环体之内的,原则上讲只能在循环体内打印
      9. function fn2(){
      10. for(var i = 0; i < 5; i++){
      11. // do something
      12. }
      13. console.log(i); //5
      14. }
      15. fn2();
    • let:ES6新增,用于声明变量,有块级作用域  下面换成let就不会存在上述问题:

      1. // 1. 不会存在声明提前,必须先声明
      2. console.log(name); //此处会报错
      3. let name = "哈哈";
      4. // 2. 不会有变量覆盖
      5. let demo = "小明";
      6. let demo = "小红";
      7. console.log(demo)// 此处会报错 告诉你已经定义了此变量
      8. // 3. 有块级作用域
      9. function fn2(){
      10. for(let i = 0; i < 5; i++){
      11. // do something
      12. }
      13. console.log(i); // 此处会报错,无法打印
      14. }
      15. fn2();
    • const:ES6新增 声明一个只读的常量,一旦声明,常量的值就不能改变
    • 一般用于全局变量
    • 通常变量名全部大写(请按照规则来,不要乱搞,容易出事情)
    const PI = "3.1415926";

    2. 解构赋值

    • 解构赋值是对赋值运算符的扩展
    • 针对数组或者对象进行模式匹配,然后对其中的变量进行赋值
    • 代码简洁且易读,语义更加清晰明了,方便了复杂对象中数据字段获取
    • 如果解构不成功,变量的值就等于undefined

    2.1 对象解构赋值

    1. let url = { username: "小红", password: "123455" };
    2. let { username, password } = url;
    3. console.log(username); //"小红"
    4. console.log(password); //"123455"

    2.2 数组解构赋值

    1. let [, , third] = ["foo", "bar", "baz"];
    2. third // "baz"

    2.3 函数参数的解构赋值

    1. function move({ x = 0, y = 0 } = {}) {
    2. return [x, y];
    3. }
    4. console.log(move({ x: 3, y: 8 })); // [3, 8]
    5. console.log(move({ x: 3 })); // [3, 0]
    6. console.log(move({})); // [0, 0]
    7. console.log(move()); // [0, 0]

    扩展运算符

    用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的散列值。

    console.log([1, 2, 3]);     //[1, 2, 3]

    console.log(...[1, 2, 3]);  //1 2 3

    rest 运算符

    也是三个点号(形式为...变量名),不过其功能与扩展运算符恰好相反,把逗号隔开的散列组合成一个数组,用于获取函数的多余参数

    1. function fun(a, b, ...values) {
    2. console.log(a); //1
    3. console.log(b); //2
    4. console.log(values); //[3, 4, 5, 6]
    5. }
    6. fun(1, 2, 3, 4, 5, 6);

    3. 模板字符串

    • 模板字符串相当于加强版的字符串,用反引号 ``
    • 除了作为普通字符串,还可以用来定义多行字符串,可以在字符串中加入变量和表达式

    3.1 普通字符串

    1. // 普通字符串
    2. let ttring = "hello"+"小兄弟";
    3. console.log(ttring);// hello小兄弟
    4. // 如果想要换行\n
    5. let tring = "hello'\n'小兄弟"
    6. console.log(tring);// hello
    7. // 小兄弟

    3.2 模板字符串

    1. let str1 = "穿堂而过的";
    2. let str2 = "风";
    3. // 模板字符串
    4. let newStr = `我是${str1}${str2}`;
    5. console.log(newStr)// 我是穿堂而过的风
    6. // 字符串中调用方法
    7. function fn3(){
    8. return "帅的不行!";
    9. }
    10. let string2= `我真是${fn3 ()}`;
    11. console.log(string2); // 我真是帅的不行!

    4. ES6 函数

    4.1 箭头函数

    • 箭头函数是一种更加简洁的函数书写方式
    • 箭头函数本身没有作用域(无this)
    • 箭头函数的this指向上一层,上下文决定其this
    • 基本语法:参数 => 函数体

     a. 基本用法

    1. let fn = v => v;
    2. //等价于
    3. let fnn = function(num){
    4. return num;
    5. }
    6. fnn(100);
    7. console.log(fnn(100));// 输出100

    b. 带参数的写法

    1. let fn2 = (num1,num2) => {
    2. let result = num1 + num2;
    3. return result;
    4. }
    5. fn2(3,2);
    6. console.log(fn2(3,2));// 输出5

    c. 箭头函数中的this指向问题

    • 箭头函数体中的 this 对象,是定义函数时的对象,而不是使用函数时的对象。在函数定义的时候就已经决定了
    1. function fn3(){
    2. setTimeout(()=>{
    3. // 定义时,this 绑定的是 fn3 中的 this 对象
    4. console.log(this.a);
    5. },0)
    6. }
    7. var a = 10;
    8. // fn3 的 this 对象为 {a: 10},因为它指向全局: window.a
    9. fn3.call({a: 18}); // 改变this指向,此时 a = 18

    5. Class类

    • class (类)作为对象的模板被引入,可以通过 class 关键字定义类
    • class 的本质是 function,同样可以看成一个块
    • 可以看作一个语法糖,让对象原型的写法更加清晰
    • 更加标准的面向对象编程语法

    5.1 类的定义

    1. // 匿名类
    2. let Demo = class {
    3. constructor(a) {
    4. this.a = a;
    5. }
    6. }
    7. // 命名类
    8. let Demo = class Demo {
    9. constructor(a) {
    10. this.a = a;
    11. }
    12. }

     5.2 类的声明

    • 类不能重复声明
    • 类定义不会被提升,必须在访问前对类进行定义,否则就会报错。
    • 类中方法不需要 function 关键字。
    • 方法间不能加分号
    1. class Demo {
    2. constructor(a) {
    3. this.a = a;
    4. }
    5. }

    5.3 类的主体

    • 公共属性(依然可以定义在原型上)
      1. class Demo{}
      2. Demo.prototype.a = 2;
    • 实例属性
      1. class Demo {
      2. a = 2;
      3. constructor () {
      4. console.log(this.a);
      5. }
      6. }
    • 方法:constructor
      1. class Demo{
      2. constructor(){
      3. console.log('我是构造器');
      4. }
      5. }
      6. new Demo(); // 我是构造器

      5.4 实例化对象

      1. class Demo {
      2. constructor(a, b) {
      3. this.a = a;
      4. this.b = b;
      5. console.log('Demo');
      6. }
      7. sum() {
      8. return this.a + this.b;
      9. }
      10. }
      11. let demo1 = new Demo(2, 1);
      12. let demo2 = new Demo(3, 1);
      13. // 两者原型链是相等的
      14. console.log(demo1._proto_ == demo2._proto_); // true

      6. Map()

    •  Map 是一个构造函数,通过 new 生成 Map 数据结构实例。 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应。

    6.1 Maps 和 Objects 的区别 

    • 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值
    • Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是
    • Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算

    6.2 Map中的key

    1. // 1. key是字符串
    2. let myMap = new Map();
    3. let keyString = "string";
    4. myMap.set(keyString, "和键'string'关联的值");
    5. // keyString === 'string'
    6. myMap.get(keyString); // "和键'string'关联的值"
    7. myMap.get("string"); // "和键'string'关联的值"
    8. // 2.key是对象
    9. let myMap = new Map();
    10. let keyObj = {},
    11. myMap.set(keyObj, "和键 keyObj 关联的值");
    12. myMap.get(keyObj); // "和键 keyObj 关联的值"
    13. myMap.get({}); // undefined, 因为 keyObj !== {}
    14. // 3. key也可以是函数或者NaN

     6.3 Map 的迭代

    1. // 1.使用 forEach
    2. let myMap = new Map();
    3. myMap.set(0, "zero");
    4. myMap.set(1, "one");
    5. // 0 = zero , 1 = one
    6. myMap.forEach(function(value, key) {
    7. console.log(key + " = " + value);
    8. }, myMap)
    9. // 2. 也可以使用 for...of

    6.4 Map 与 Array的转换

    1. letkvArray = [["key1", "value1"], ["key2", "value2"]];
    2. // Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象
    3. let myMap = new Map(kvArray);
    4. // 使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
    5. let outArray = Array.from(myMap);

    6.5 Map和ForEach 的区别

         .forEach() 适合于你并不打算改变数据的时候,而只是想用数据做一些事情

    1. let arr = ['a', 'b', 'c', 'd'];
    2. arr.forEach((val) => {
    3. console.log(val); // 依次打印出 a,b,c,d
    4. });
    • map() 适用于你要改变数据值的时候,它更快,而且返回一个新的数组
      1. let arr = [1, 2, 3, 4, 5];
      2. let arr2 = arr.map(num => num * 2).filter(num => num > 5);
      3. console.log(arr2);// arr2 = [6, 8, 10]

    7.for...of 循环

    可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如 arguments对象、DOM NodeList 对象)、字符串。 for...of 不能遍历普通 Object 对象。 for...in 循环,只能获得对象的键名,不能直接获取属性值。 for...of 循环,允许遍历获得属性值。


    8.Promise对象

    用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作。将异步操作以同步操作的流程表示出来,利于阅读和维护。将数据请求和数据处理明确区分开,掌握控制权

    9.async/await 

    async 也是处理异步的,它是对 Promise 的一种扩展,让异步更加方便

    async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。当函数执行的时候,一旦遇到 await 就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

  • 相关阅读:
    媳妇面试了一家公司,期望月薪20K,对方没多问就答应了,只要求3天内到岗,可我总觉得哪里不对劲。
    java计算机毕业设计ssm+vue楼市销售系统
    golang工程管理实现简单计算器
    激光雷达:Ouster OS产品介绍及使用方法
    JVM(Java虚拟机)笔记
    spyder打不开了
    图像分割算法
    Hive字符串函数-空格处理
    SpringBoot (1)
    Yakit工具篇:爆破与未授权检测的使用
  • 原文地址:https://blog.csdn.net/weixin_58431406/article/details/125501221