ES6特性

ES6 rest参数
ES6引入rest参数,用于获取函数的实参,用来代替arguments,arguments输出结果是一个

function fn1() {
            console.log(arguments);
        }
        fn1(1, 2, 3, 1)
//输出结果是对象形式

function fn(a, b, ...args) {
            console.log(a);
            console.log(b);
            console.log(args);
        }
        fn(1, 2, 3, 4, 5)
//输出结果args是数组,这样可以使用数组的一些方法

扩展运算符…
1.可以拼接数组 在调用函数时做实参使用
2.数组的克隆
3.将伪数组转为真数组 […divs ] 可以将对象转化为真数组 就可以使用数组的方法

Symbol基本使用
ES6引入了一种新的原始数据类型symbol,表示独一无二的值,他是js中的第七种数据类型,是一种类似于字符串的数据类型
1)Symbol的值是唯一的,用来解决命名冲突的问题
2)Symbol值不能与其他数据进行运算
3)Symbol定义的对象属性不能使用for…in 遍历循环,但是可以使用Reflect.ownKeys来获取对象的所有键名

let s =Symbol( ) //用函数声明Symbol
let s=Symbol.for( )//此时的Symbol是对象

        let game = {
            name: '狼人杀',
            //用symbol为game添加唯一属性
            [Symbol('say')]: function() {
                console.log("我可以说话");
            },
            [Symbol("bao")]: function() {
                console.log("可以自爆");
            }
        }
        console.log(game);

迭代器
Symbol与for… in迭代: (Array arguments Set Map string TypedArray NodeList)
工作原理:1)创建一个指针对象,指向当前数据结构的起始位置
2)第一次调用的next方法,指针自动指向数据结构的第一个成员
3)接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员
4)每调用next方法返回一个包含value和done属性的对象

let xiyou = ['唐僧', '沙僧', '猪八戒', '孙悟空']
            //使用for ..of遍历数组
        for (let v of xiyou) {
            console.log(v);
            // 遍历的结果是属性值
            //而for ..in 结果是属性
        }
        let iterator = xiyou[Symbol.iterator]()
            //调用对象的next方法
        console.log(iterator.next()); //唐僧
        console.log(iterator.next()); //沙僧
        console.log(iterator.next()); //猪八戒 
        console.log(iterator.next()); //孙悟空
        console.log(iterator.next());

生成器函数
是一种特殊的函数,可以实现异步编程 function *gen( ){ }
Generator.prototype.next()
返回一个由 yield表达式生成的值 yield 关键字用来暂停和恢复一个生成器函数 它有两个属性,value和done。value属性是对yield表达式求值的结果,而done是false,表示生成器函数尚未完全完成。

<script>
        //异步编码
        //实现 1s后发送111 然后2s后发2222 然后3s后发333
        function one() {
            setTimeout(() => {
                console.log(111);
                iterator.next();
            }, 1000)
        }

        function two() {
            setTimeout(() => {
                console.log(222);
                iterator.next();
            }, 2000)
        }

        function three() {
            setTimeout(() => {
                console.log(333);
                iterator.next();
            }, 3000)
        }
        //生成器函数调用
        function* gen() {
                yield one();
                yield two();
                yield three();
            }
            //调用生成器函数
        const iterator = gen()
        iterator.next();
    </script>

调用 next()方法时,如果传入了参数,那么这个参数会传给上一条执行的 yield语句左边的变量,例如下面例子中的 x :

function *gen(){
    yield 10;
    x=yield 'foo';
    yield x;
}

var gen_obj=gen();
console.log(gen_obj.next());// 执行 yield 10,返回 10
console.log(gen_obj.next());// 执行 yield 'foo',返回 'foo'
console.log(gen_obj.next(100));// 将 100 赋给上一条 yield 'foo' 的左值,即执行 x=100,返回 100 
console.log(gen_obj.next());// 执行完毕,value 为 undefined,done 为 true

Promise
Promise是ES6引入的异步编程的新解决方案,语法上Promise是一个构造函数,用来封装一步操作并获取其成功或失败的结果
1)Promise构造函数:Promise(excutor){ }
2)Promise.prototype.then方法
3)Promise.prototype.catch方法

        //实例化Promise函数(异步返回的数据是response.data)
        const p = new Promise(function(resolve, reason) {
            setTimeout(function() {
                //let data = '数据调用成功';
                //resolve(data); //resolve表示该函数调用成功

                let err = '数据调用失败'
                reason(err) //reason表示该函数调用成功
            }, 1000)
        });
        //调用Promise的then方法
        p.then(function(value) {
            //调用成功则触发第一个函数
            console.log(value); //数据调用成功
        }, function(reason) {
            //调用失败则触发第二个函数
            console.log(reason); //数据调用失败
        })

Set对象是值的集合
Set中的元素只会出现一次

        var arr = [2, 5, 6, 1, 5, 3, 2]
        var s = [...new Set(arr)]; //set返回的是一个集合通过扩展将其转变为真数组
        console.log(s); // [2, 5, 6, 1, 3] 实现去重

        var s1 = new Set()
        console.log(s1.add(7)); //在Set对象尾部添加一个元素。返回该Set对象
        console.log(s1.has(7)); // true 返回一个布尔值,表示该值在Set中存在与否。
        console.log(s1.delete(6)); //移除Set中与这个值相等的元素 如果删除有这个值则返回true
        console.log(s1.size); //返回 Set 对象中的值的个数

        for (var v of s) {
            console.log(v); //通过for..of来迭代set
        }
        //set实践
        var arr = [1, 2, 5, 9, 6, 3, 7, 1]
            //1.交集
        var arr1 = [2, 6, 8, 9, 6]
        const result = [...new Set(arr)].filter(item => {
            let s1 = new Set(arr1)
            if (s1.has(item)) {
                return true
            } else {
                return false
            }
        })
        console.log(result);

        //并集
        let newArr = [...new Set([...arr, ...arr1])]
        console.log(newArr);

        //差集
        let result1 = [...new Set(arr)].filter(item => !(new Set(arr1).has(item)))
        console.log(result1);

Map 对象保存键值对

        let myMap = new Map();
        myMap.set('name', '小明') //添加键
        myMap.set('method', function() {
            console.log('打印输出');
        })
        console.log(myMap.size); //2 相当于length

        console.log(myMap); //{"name" => "小明", "method" => ƒ}
        //获取值
        console.log(myMap.get('method'))

        for (var v of myMap) {
            console.log(v);
            //["name", "小明"]
            //["method", ƒ]
        }


        for (var key of myMap.keys()) {
            console.log(key); //name method 获取键名
        }

        for (var value of myMap.values()) {
            console.log(value); //获取键值
        }

        for (let [key, value] of myMap.entries()) {
            console.log(key + " = " + value);
        }

class 声明对象类
关键字static将为一个类定义一个静态方法。静态方法不会在实例中被调用,而只会被类本身调用。它们经常是工具函数,比如用来创建或者复制对象。

class ClassWithStaticMethod {

  static staticProperty = 'someValue';
  static staticMethod() {
    return 'static method has been called.';
  }

}

console.log(ClassWithStaticMethod.staticProperty);
// output: "someValue"
console.log(ClassWithStaticMethod.staticMethod());
// output: "static method has been called."

ES6模块化的好处
1、防止命名冲突
2、代码复用
3、高维护性

模块命令主要由命令组成:export和import
export命名用于规定模块的对外接口
import命名用于输入其他模块提供的功能

export default {
//默认暴露
}
这个方法调用方法的时候需要用如 m1.default.call( )

   //通用的导入方式
        import *as m1 from "./js/m1.js" ;
        console.log(m1) // 引入js下m1文件

        //2. 解构赋值的形式
        import {school,call} from './js/m1.js'

        //3.简单形式,只针对默认暴露
        import m3 from './js/m3.js'

ES8–async函数
async和await两种语法结合可以让异步代码像同步代码一样
async函数:1.async函数的返回值是Promise对象
2.promise对象的结果由async函数执行的返回值决定

await表达式:1.await必须写在async函数中
2.await右侧表达式一般为promise对象
3.await返回的是promise成功的值
4.await的promise失败了,就会抛出异常,需要通过try…catch捕获处理

async function fn() {
            //返回一个字符串
            // return 'sgg'
            //返回的结果不是一个Promise类型的对象,返回的结果就是成功的
            // return
            //返回的结果如果是一个promise对象
            return new Promise((resolve, reject) => {
                resolve('成功的数据')
            })
        }
        const result = fn()
            //调用then方法
        result.then(value => {
            console.log(value);
        }, reason => {
            console.warn()
        })

Entries和fromEntries方法的比较
entries是将对象转为二维的数组
而fromEntries是将二维数组转换为对象

flat
flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回

const arr1 = [0, 1, 2, [3, 4]];

console.log(arr1.flat());
// expected output: [0, 1, 2, 3, 4]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值