01es6新增数据类型

1.symbol

ES5中包含5种基本数据类型:字符串、数字、布尔值、null和undefined。
ES6引入了第6种基本数据类型——Symbol
ES6引入Symbol的作用:
	表示唯一的值
	对于位置内容的第三方包,想为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突。
    保证每个属性的名字都是独一无二的,上防止了属性名冲突。
创建方法
	    let sym1 = Symbol();
        let sym2 = Symbol('描述symbol信息');
        let sym3 = Symbol('年龄');
        console.log(sym3==sym1); //false
        console.log(typeof sym1); //symbol

2.map & set

2.1
set:就是一个数据集合 =>类似数组
作用:存储的无序的一组数据且数据不能重复
创建:
	const set1 = new Set()
	const set1 = new Set([1,true,'hai',{username:'lili'}])
属性和方法:
	set1.size //长度
	set1.add(null) //添加
	set1.delete(true) //删除
    set1.clear() //清除所有数据
    set1.forEach(item=>{ //遍历
                console.log(item);
            })
	arr = [...set1] //转化成数组
数组去重方法一:
            let arr = [1,2,3,4,4,3,2,5]
            console.log(arr);
            let set1 = new Set(arr)
            arr = [...set1]
            console.log('去重后',arr);
数组去重方法二:
		   let arr = [1,2,3,4,4,3,2,5]
            let newArr = [];
            for(let i=0;i<arr.length;i++){
                if(newArr.indexOf(arr[i])==-1){
                    newArr.push(arr[i])
                }
            }
            console.log('去重后',newArr);
数组去重方法三:
            let arr = [1,2,3,4,4,3,2,5]
            for(let i=0;i<arr.length;i++){
                for(let j=i+1;j<arr.length;j++){
                    if(arr[i] == arr[j]){
                        arr.splice(j,1)
                    }
                }
            }
            console.log('去重后',arr);
2.2
map 数据集合 => 类似对象
创建 & 语法:
        const map1 = new Map()
        const map2 = new Map([[true,true],[1,2],['li',{username:123}]])
注意:key value 可以是任意数据类型
属性和方法:
	    map2.size //数据长度
        map2.delete(1) //删除数据
        map2.set({name:'jack'},12) //添加数据
        console.log(map2.get('li')); //获取数据  {username:123}
        map2.clear() //清除所有数据
        console.log(map2.has('li')); //判断是否存在
        console.log(map2);

02 设计模式

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案
总共有 23 种经典设计模式。这些模式可以分为三大类:
	创建型模式(Creational Patterns)、
	结构型模式(Structural Patterns) =>这些设计模式关注类和对象的组合。
	行为型模式(Behavioral Patterns) ->这些设计模式特别关注对象之间的通信。

1.创建型模式 - 单例模式

这种模式确保整个应用中只有单个对象存在。
 class Person {
            //static静态方法,可以通过类名调用
            static getInstance(name) {
                if (this.instane == null) {
                    this.instane = new Person(name)
                }
                return this.instane
            }
            constructor(name) {
                this.name = name
            }
        }

        // let p11 = new Person('jack')
        // let p21 = new Person('jack')
        let p1 = Person.getInstance('jack')
        let p2 = Person.getInstance('jack')
        console.log(p1 === p2); //true

2.组合模式

组合模式,就是把几个构造函数的启动方式组合再一起 , 然后用一个 ”遥控器“ 进行统一调用
	    组合类
        class Compose{
            constructor(){
                this.list = [] //装任务
            }
            addTask(task){
                this.list.push(task)
            }
            start(){
                this.list.forEach(item=>{
                    item.init()
                })
            }
        }

        class GetHome{
            init(){
                console.log('到家了')
            }
        }
        class OpenComputer{
            init(){
                console.log('打开电脑');
            }
        }
        class PlayGame{
            init(){
                console.log('玩游戏');
            }
        }
        let getHome = new GetHome()
        let openComputer = new OpenComputer()
        let playGame = new PlayGame()

        // getHome.init()
        // openComputer.init()
        // playGame.init()

        let compose = new Compose()
        compose.addTask(getHome)
        compose.addTask(openComputer)
        compose.addTask(playGame)
        compose.start()

3.观察者模式

观察者模式	对象之间通讯
 	明星    粉丝1  粉丝2  粉丝3  
明星更新动态,所有关注的粉丝都能收到信息
		  //明星
           class Subject{
            constructor(name){
                this.name = name,
                this.list = []
            }
            //添加粉丝
            add(observer){
                this.list.push(observer) //数组添加粉丝
            }
            //明星更新动态
            update(message){
                this.list.forEach(item=>{
                    item.notify(message) //粉丝接收信息
                })
            }
        }
        //粉丝
        class Observer{
            constructor(name){
                this.name = name
            }
            notify(message){
                console.log(this.name+'收到' + message);
            }
        }
        let star1 = new Subject('赵丽颖')
        let fs1 = new Observer('萤火虫1号')
        let fs2 = new Observer('萤火虫2号')
        let fs3 = new Observer('萤火虫3号')
        star1.add(fs1) //粉丝先关注
        star1.add(fs2) //粉丝先关注
        star1.add(fs3) //粉丝先关注
        star1.update('好想你们,萤火虫')

03 模块化开发

模块化开发
            每个js文件都可以被看作一个模块
            在模块里面可以定义属性和方法,这些属性和方法属于模块私有,
            模块可以暴露属性和方法供其它模块使用
1.es6新方法 适用于前后端