2021-03-21 ES6-全部笔记

ES6

声明与表达式

let

作用域在块里面

var

全局

注意 函数有自己的作用域

const

常量

常量的值 是不能被更改的

可以使用const 来做预定义 处理

应用场景

1.私有协议

即时通讯

与硬件通讯

2.预定义数据值

网络接口

解构赋值

定义

解构赋值是对赋值运算符的扩展。

他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。

在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取

数组格式的解构赋值

基本

let [a,b] = [2,3];

let [username,age] = ["小明",2]

可嵌套

let [username,[boy,girl],age] = ["小明",["小猫","小花"],12];

可省略

  /*

    * 可以省略部分变量名

    * */

    let [a,,,b] = [1,3,5,6];

    console.log(a)

    console.log(b)

不完全解构

如果有变量 不需要初始化值 就可以使用不完全解构

let [view = document.createElement("div"),timer] = [];

剩余运算符

var [timer,...views] = [0,[document.createElement("div"),document.createElement("div")]]

    console.log(views[0][0]);

字符串

let [a, b, c, d, e] = 'hello';

// a = 'h'

// b = 'e'

// c = 'l'

// d = 'l'

// e = 'o'

对象模型的解构(Object)

基本

let { foo, bar } = { foo: "哈哈哈", bar: 'bbb' };

    console.log(foo,bar);

可嵌套

{

        let {a:[b,c]} = {a:[22,33]}

        console.log(b)

        console.log(c)

        let {key:[name1,name2]} = {key:["属性1的值","属性2的值"]}

        console.log(name1)

        console.log(name2)

        let {

            listener:[

                click,

                dlclick,

                tapstart

            ],

            event:[ce,de,te]

        } = {

            listener:[

                function () {

                    console.log("click")

                },

                function () {

                    console.log("dlclick")

                }

            ],

            event:[{name:"点击"},{name:"双击"}]

        }

        click();

        console.log(ce)

        /*

        * 定义接口文件 http

        *

        * 主机地址 host:"api.bianmazhe.com"

        * 测试环境 evn:true

        * api:

        *  login:"/login"

        *  register:"/register"

        * */

        let {http:[host,evn,api]} = {

            http:["api.bianmazhe.com",false,{login:"/login",register:"/register"}]

        }

        console.log(api.login)

        let {http:[host1,evn1,[login,register]]} = {

            http:["api.bianmazhe.com",false,["/login","/register"]]

        }

        console.log(login);

    }

可省略

let {key:[]} = {key:[2,3]}

        let {key:[]} = {key:[2,3],key2:"dfk"}

        let {} = {key:[2,3]}

不完全解构

let obj = {p: [{y: 'world'}] };

let {p: [{ y }, x ] } = obj;

// x = undefined

// y = 'world'

剩余运算符

let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};

// a = 10

// b = 20

// rest = {c: 30, d: 40}

Symbol

用于定义一个独一无二的属性

通过Symbol创建出来的两个属性是不相同的

    let n1 = Symbol(2);

    let n2 = Symbol(2);

    console.log(n1 === n2);

数据类型

string

模板字符串

`

`

允许换行

    var container = document.querySelector(".container");

    container.innerHTML  = `

   

       

               

  •            

  •            

  •            

  •            

  •        

   

    `;

支持嵌入变量

    var item = "标题";

    var container = document.querySelector(".container");

    container.innerHTML  = `

   

       

               

  • ${item}
  •            

  •            

  •            

  •            

  •        

   

    `;

新增方法

includes():返回布尔值,判断是否找到参数字符串。

startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。

endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。

字符串重复

repeat

console.log("Hello,".repeat(2));  // "Hello,Hello,"

字符串补全

padStart

padEnd

console.log("h".padStart(5,"o"));  // "ooooh"

console.log("h".padEnd(5,"o"));    // "hoooo"

console.log("h".padStart(5));      // "    h"

array

创建数组

Array.of()

Array.from()

查找符合的元素

find

    var arr = [33,4,2,99];

    var v = arr.find(function (item) {

        return item<10;

    });

    console.log(v);

查找符合元素的下标

findIndex()

    var index = arr.findIndex(function (item) {

        return item < 10;

    })

    console.log(index);

填充

fill(要填充的值,填充的位置,可选(填充结束的位置)) 

返回一个填充好的数组

let arr = Array.of(1, 2, 3, 4);

// 参数1:用来填充的值

// 参数2:被填充的起始索引

// 参数3(可选):被填充的结束索引,默认为数组末尾

console.log(arr.fill(0,1,2)); // [1, 0, 3, 4]

嵌套数组(多维)转一维数组

flat

    var arr5 = [[[[1,4,5]],[55,77]],[3,9]]

    //Infinity 无穷数

    var arr6 = arr5.flat(Infinity);

    console.log(arr6);

合并数组

    var arr7 = [3,4,88];

    console.log([1,...arr7]);

set

类似数组

set里面的数据 都是唯一的

初始化

new Set()

存取值

存值

add();

数组去重

    var arr7 = [77,55,77,99,55];

    var set2 = new Set(arr7);

    console.log(set2);

map

类似Object

一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。

Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。

Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。

Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

初始化

new Map()

存取之

set(key,value)

get(key)

长度

size

遍历

for in

    for (let key in map){

        console.log(map.get(key));

    }

for of

    for ( let [key,value] of map){

        console.log(key,value);

    }

forEach

    map.forEach(function (item,key) {

        console.log(item,key)

    })

函数

可以给函数的形参 添加默认值

    function f(a=1,b=3) {

    }

箭头函数

作用

语法简洁

var fun2 = function () {

        console.log("...");

    }

    var fun2 = ()=>{

        console.log("....");

    }

    fun2();

    //传参数 简化写法

    var fun3 = a => {

        console.log(a);

    }

    var fun4 = (a,b) => {

        console.log(a,b);

    }

    //函数体比较简单 省略花括号

    var sum = (a,b) => a+b;

    var sum = function (a,b) {

        return a+b;

    }

无需在箭头函数中 再去设置this指向

  function View() {

        this.title = "标题";

        var self = this;

        this.dom = document.querySelector(".container");

        this.dom.onclick = function () {

            alert(self.title)

        }

        this.dom.onclick =  ()=> {

            alert(this.title)

        }

    }

    new View();

对象

简写

属性

var obj = {uname,uage};

方法

var obj = {

        run(){}

    }

使用...合并对象

var obj1 = {a:1,b:3}

var obj2 = {...obj1};

is

类方法(静态方法)

    var obj3 = {};

    var obj4 = {};

    var obj5 = obj3;

    console.log(Object.is(obj3,obj4));

    console.log(Object.is(obj3,obj5));

assign

浅拷贝 是一个静态方法

    var tObj = {}

    var sObj = {a:1,b:2};

    Object.assign(tObj,sObj);

    console.log(tObj);

class关键字

定义类

  /*

    * class 关键字 创建类

    * */

    class Person{}

constructor

构造函数

注意:

1.构造函数 是一个特殊的函数

在实例化对象(new)的时候 就会自动调用这个函数

2.不一定必须实现构造函数->可以省略

  /*

    * class 关键字 创建类

    * */

    class Person{}

    /*

    * ES6 构造函数

    * */

    class Animation{

        constructor(...args) {

            console.log(args);

        }

    }

    new Animation(1,2);

    new Person();

属性

原型属性

实例属性

  class ImageView{

        //原型属性

        path = "";

        constructor() {

            this.ttt = "实例属性"

        }


    }

set get 方法

防止类中的set get方法的递归调用

        get hname(){

            return this.hname;

        }

        set hname(_name){

            console.log(_name);

            this.hname = _name;

        }

注意 使用set get方法的属性名前 添加_

  class Hero {

        constructor(_name) {

            this.hname = _name;

        }

        get hname(){

            return this._hname;

        }

        set hname(_name){

            console.log(_name);

            this._hname = _name;

        }

    }

静态属性 静态方法

需要使用 static 关键字

  class Weapon{

        static type = "魔法装";

        static att(){

            console.log("攻击")

        }

    }

    console.log(Weapon.type);

    Weapon.att();

继承

使用extends 实现继承

super

调用父类的构造函数

    class Student{

        constructor() {

            console.log("我要学到很多知识");

        }

        study(){console.log("好好学习")}

    }

    //extends 关键字  可用于继承

    class TangZhi extends Student{

        constructor() {

            //使用父类的构造函数

            super();

            console.log("我得学好了 找个合心的工作");

        }

    }

    let haoXueSheng = new TangZhi();

    haoXueSheng.study();

模块

把具有相同功能的代码 组织到一起 ->这一块 代码 就可以看成一个模块

ES6

1.引入js 需要添加type属性 属性值是module

2.导出模块 导入模块

导出模块

export

1.

export {obj999,obj777} 可以同时导出多个 对象

2.导出一个模块

export default StringTool;

导入模块

import

1.    import {obj999,obj777} from "./StringTool.js"  可以同时导入多个对象

    console.log(obj999)

2.导入一个模块

import StringTool from "./StringTool.js";

as 给模块 重命名

export {StringTool as ST}

import {ST} from "./StringTool";

异步编程

Promise

允诺 承诺

完成

then

出现意外

catch

创建

new Promise(function(success,fail){})

new Promise((success,fail)=>{})

async

异步 函数

会得到一个promise对象

await

可以让修饰的部分 等待执行(必须与异步函数配合使用)

如果promise对象有结果的时候 再执行

    function fun() {

        return new Promise(success=>setTimeout(()=>success(111),1000))

    }

    async function fun2() {

        let a = await fun();

        console.log(a);

        console.log("fun2")

    }

    fun2()

如果等待的是promise对象,先等待promise有回应了 并且解析要传递出来的数据 才会继续执行

js实现同步

Generator 函数

定义

一是在 function 后面,函数名之前有个 * ;

就可以定义成 一个生成器类型的函数

函数内部有 yield 表达式。

调用

使用生成器里面的每一个模块

let f = fun();//得到生成器对象

f.next();//可以执行通过yield分成的模块

f.next();

f.next();//如果f.next();done:true已经执行完所有的模块

注意:

不要每一次调用next函数 都是用一个新的生成器对象调用

这样执行的永远都是第一个模块的内容

fun().next();//可以执行通过yield分成的模块

fun().next();

fun().next();//如果f.next();done:true已经执行完所有的模块

next会返回一个对象

value

done

迭代器

核心概念

迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。

迭代器是用于遍历数据结构元素的指针(如数据库中的游标

    let arr = [1,2,3,45,7,5];

    let it = arr[Symbol.iterator]();

    console.log(it.next());

代理、映射

代理

帮别人干某些事

Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作

    //想找代理的人

    let xiaoMao = {

        username:"小毛",

        age:18

    }

    //帮忙干事的人(做代理的人)

    let handler = {

        get(target,key){

            console.log("收100元");

            //...

            return target[key];

        },

        set(target,key,value){

            console.log("收500元");

            //..

            target[key] = value;

        }

    };

    //组织两人关系的地方

    let py = new Proxy(xiaoMao,handler);

    console.log(py.username);

    py.age = 30;

映射 反射 Reflect

Reflect.get(target, name, receiver)

你可能感兴趣的:(2021-03-21 ES6-全部笔记)