【前端学习笔记】day41:ES6(下)

86 阅读1分钟

类的继承

 <!-- 类继承 -->
    <script>
        // ES5构造函数的继承

        // 手机
        function Phone(brand, price) {
            this.brand = brand;
            this.price = price;
        };

        Phone.prototype.call = function () {
            console.log('I can cell somebody');
        };

        // // 智能手机
        function SmartPhone(brand, price, color, size) {
            Phone.call(this, brand, price);
            this.color = color;
            this.size = size;

        };

        // // 设置子级构造函数的原型
        SmartPhone.prototype = new Phone;
        // // 校正
        SmartPhone.prototype.constructor = SmartPhone;

        // // 声明子类的方法
        SmartPhone.prototype.photo = function () {
            console.log('I can take photograph');
        };

        SmartPhone.prototype.playGame = function () {
            console.log('I can play game');
        };

        const iphone = new SmartPhone('iphone', 4999, 'black', '4.7inch');
        console.log(iphone);


        // 类继承
        class Phone{
            constructor(brand,price){
                this.brand=brand;
                this.price=price;
            }

            // 父类的成员属性
            call(){
                console.log('I can cell somebody');
            }
        };

        class SmartPhone extends Phone{
            // 构造方法
            constructor(brand,price,color,size){
                super(brand,price);
                this.color=color;
                this.size=size;
            }

            photo(){
                console.log('I can take aphotograph');
            }

            playGame(){
                console.log('I can play game');
            }

            // 子类对父类方法的重写
            // 子类不能直接调用父类的同名方法
            call(){
                console.log('I can make a video call');
            }
        };

        const xiaomi= new SmartPhone('xiaomi',1999,'red','5.5inch');
        console.log(xiaomi);
        xiaomi.call();
        xiaomi.photo();
        xiaomi.playGame();
    </script>

class 的 get 和 set

<script>
        // get & set
       class Phone{
        //    get 通常对对象的动态属性做封装
           get price(){
               console.log('The price attibute is read');
               return '价格';
           }

        //    set可以添加更对的控制和判断
           set price(newVal){
               console.log('The price has been modified');
           }
       }

    //    实例化对象
    let s=new Phone();
    // console.log(s.price);
    s.price='free';
    </script>   

数值扩展

    <script>
        // 数值扩展
        // Number.EPSILON 是JavaScript表示的最小的精度  是一个非常小的数
        function equal(a, b) {
            if (Math.abs(a - b) < Number.EPSILON) {
                return true;
            } else {
                return false;
            }
        };
        console.log(0.1 + 0.2 === 0.3);
        console.log(equal(0.1 + 0.2, 0.3));


        // 1. 二进制和八进制
        let b = 0b1010;
        console.log(b);
        let o = 0o777;
        console.log(o);
        let d = 100;
        console.log(d);
        let x = 0xff;
        console.log(x);


        // 2.Number.isFinite   检测一个数值是否为有限数
        console.log(Number.isFinite(100));
        console.log(Number.isFinite(100 / 0));
        console.log(Number.isFinite(Infinity));


        // 3. Nubmer.isNaN  检测一个数值是否为NaN
        console.log(Number.isNaN(123));


        // 4. Number.parseInt   Number.parseFloat  字符串转整数/浮点数
        console.log(Number.parseInt('5211314love')); //会截断  输出5211314
        console.log(Number.parseFloat('1.23456789神奇')); //会截断   输出1.23456789


        // 5. Nubmer.isInteger   判断一个数是否为整数
        console.log(Number.isInteger(5));
        console.log(Number.isInteger(5.1));


        // 6. Math.trunc    将数字的小数部分抹掉
        console.log(Math.trunc(3.1415));


        // 7. Math.sign    检测一个数到底是正数 负数 还是0
        console.log(Math.sign(100));
        console.log(Math.sign(0));
        console.log(Math.sign(-10));
    </script>

对象方法扩展

    <script>
        // 1. object.is  判断两个值是否完全相等
        console.log(Object.is(120, 120));
        console.log(Object.is(NaN, NaN)); //true
        console.log(NaN === NaN); //false


        // 2. Object.assign   对象的合并
        const config1 = {
            host: 'localhost',
            port: 3306,
            name: 'root',
            password: 'root',
            test:'test'
        }

        const config2 = {
            host: '127.0.0.1',
            port: 33060,
            name: 'Spongebob',
            password: 'password'

        }

        const config = Object.assign(config1, config2);
        console.log(config);


        // 3. Object.setPrototypeOf设置原型对象   Object.getPrototypeOf
        const school={
            name:'CUGB',
        }

        const cities={
            xiaoqu:['Beijing','Wuhan']
        }

        Object.setPrototypeOf(school,cities);
        console.log(Object.getPrototypeOf(school));
        console.log(school);

    </script>

模块化

    <script type="module">
        // 通用的导入方式
        // 引入m1.js模块内容
        import * as m1 from"./m1.js";
        console.log(m1);

        // 引入m2.js的模块内容
        import * as m2 from "./m2.js";
        console.log(m2);

        // 引入m3.js内容
        // import * as m3 from "./m3.js";
        // console.log(m3);
        // m3.default.workplace();

        // 2. 解构赋值的形式
        import {school,teach} from "./m1.js";
        console.log(school);
        console.log(teach);

        import {school as bd,study} from "./m2.js";
        console.log(bd);
        console.log(study);

        // import {default as m3} from "./m3.js";
        // console.log(m3);


        // 3. 简便形式  只能针对默认暴露
        import m3 from "./m3.js";
        console.log(m3);

    </script>

ES7新特性

 <script>
        // includes indexOf
        const mingzhu=['西游记','红楼梦','三国演义','水浒传'];

        // 判断
        console.log(mingzhu.includes('西游记'));

        // **
        console.log(2**10);    //相当于Math.pow(2,10)
    </script>

ES8对象方法扩展

    <script>
        // 声明对象
        const school={
            name:'CUGB',
            cities:['Beijing','Wuhan'],
            xueke:['dizhi','tumu','zhubao']
        };

        // 获取对象所有的键
        // console.log(Object.keys(school));

        // 获取对象所有的值
        // console.log(Object.values(school));

        // entries
       const m=new Map(Object.entries(school));
       console.log(m.get('cities'));

        // 对象属性的描述对象
       console.log(Object.getOwnPropertyDescriptors(school));
    </script>

ES9 新特性

    <script>
        // Rest 参数与spread扩展运算符在ES6中已经引入,不过ES6中只针对于数组,在ES9中为对象提供了像数组一样的rest参数和扩展运算符

        function connect({
            host,
            port,
            ...user
        }) {
            console.log(host);
            console.log(port);
            console.log(user);


        }

        connect({
            host: '127.0.0.1',
            port: 3306,
            username: 'root',
            password: 'root'
        })


        const skillOne = {
            q: '天音波'
        };
        const skillTwo = {
            w: '金钟罩'
        };
        const skillThree = {
            e: '天雷破'
        };
        const skillFour = {
            r: '猛龙摆尾'
        }

        const mangseng={...skillOne,...skillTwo,...skillThree,...skillFour};

        console.log(mangseng);
    </script>

ES9正则扩展

    <script>
        // 命名捕获分组

        // 声明一个字符串
        let str = '<a href="http://www.baidu.com/">Baidu</a>';

        // 提取URL与标签文本
        // 之前的处理
        const reg=/<a href="(.*)">(.*)<\/a>/;

        const result=reg.exec(str);
        console.log(result[1]);
        console.log(result[2]);

        // 现在的做法
        const reg = /<a href="(?<url>.*)">(?<text>.*)<\/a>/;

        const result = reg.exec(str);
        console.log(result);



        // 反向断言
        // 正向断言 根据当前匹配的后面的内容判断前面的内容是否满足条件
        let str = 'abcdefg1234567测试测试789结尾';
        const reg = /\d+(?=结)/;
        const result = reg.exec(str);
        console.log(result);

        // 反向断言 根据当前匹配的前面的内容判断后面的内容是否满足条件
        const reg=/(?<=测试)\d+/;
        const result=reg.exec(str);
        console.log(result);



        // 正则dotAll模式
        // dot .  元字符   除换行符以外的任意单个字符
        // (先略过)
    </script>

ES10 Object.fromEntries

    <script>
        // 接收二维数组
        const result=Object.fromEntries([
            ['name','Sponge'],
            ['friend','派大星,章鱼哥,蟹老板,珊迪']
        ]);

        console.log(result);

        // Map
        const m=new Map();
        m.set('name','spongebob')
        const result=Object.fromEntries(m);
        console.log(result);

        // ES8中 Object.entries可以将一个对象转化为一个数组
        // Object.fromEntries可以将数组转化为二维对象
        // 所以Object.entries和Object.fromEntries可以算作一个逆运算
        const arr=Object.entries({
            name:'Spongebob'
        })
        console.log(arr);
    </script>

ES10字符串扩展方法

    <script>
        // 指定清除一个字符串左侧或者右侧的空白字符
        let str='                   海绵宝宝               ';
        console.log(str);
        console.log(str.trimStart());    //清除左侧空格
        console.log(str.trimEnd());      //清除右侧空格
    </script>


    <script>
        // flat  将多维数组转化为低维数组
        // const arr=[1,2,3,4,[5,6]];
        // console.log(arr.flat());

        // const arr1=[1,2,3,4,[5,6,[7,8,9]]];
        // 转换为2维数组
        // console.log(arr1.flat());
        // 转换为1维数组  参数为深度
        // console.log(arr1.flat(2));

        // flatMap
        const arr2 = [1, 2, 3, 4];
        // const result=arr2.map(item=>item*10);
        // console.log(result); //[10,20,30,40]
        const result = arr2.flatMap(item => [item * 10]);
        console.log(result);
    </script>

symbol扩展

    <script>
        // 创建symbol
        let s=Symbol('Spongebob');

        console.log(s.description);
    </script>

ES11 私有属性

    <script>
        class Person {
            // 公有属性
            name;
            // 私有属性
            #age;
            #weight;
            // 构造方法初始化
            constructor(name, age, weight) {
                this.name = name;
                this.#age = age;
                this.#weight = weight;
            }

            intro(){
                console.log(this.name);
                console.log(this.#age);
                console.log(this.#weight);
            }
        }

        // 实例化
        const girl = new Person('Mary', 18, '55kg');
        console.log(girl);
        console.log(girl.name);
        // console.log(girl.#age);
        // console.log(girl.#weight);
        girl.intro(); //可以调用
    </script>

Promise.allSettled

    <script>
        // 声明两个promise对象
        const p1=new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve('商品数据--1');
            },1000)
        });

        const p2=new Promise((resolve,reject)=>{
            setTimeout(()=>{
                // resolve('商品数据--2');
                reject('出错了');
            },1000)
        });

        // 调用allsettled方法   返回的结果始终是成功的
        // const result=Promise.allSettled([p1,p2]);
        // console.log(result);

        // 区别all 方法 都用在做一些批量异步任务的场景,但是all方法根据每个对象的状态返回结果,都成功才返回成功,有一个失败则返回的promise是失败  失败的值是数组里面那个失败的promise的值
        const res=Promise.all([p1,p2]);
        console.log(res);
    </script>

可选链操作符

    <script>
        // 对象层级比较深,可以用可选链操作符
        // ?.

        function main(config) {
            const dbHost = config?.db ?.host;
            console.log(dbHost);
        }

        main({
            db: {
                host: '127.0.0.1',
                username: 'root'
            },
            cache: {
                host: '123.234.567',
                username: 'admin'
            }
        })
    </script>

BigInt

    <script>
        // 大整型
        let n=123n;
        console.log(n,typeof(n));

        // 函数
        let n1=123;
        console.log(BigInt(n1));
        // console.log(BigInt(1.2));  //不可以使用浮点数

        // BigInt主要用于大数值运算
        // 最大安全整数
        let max=Number.MAX_SAFE_INTEGER;
        console.log(max+2);  //不能正常运算
        // BigInt不能与正常的数值做运算,必须与BigInt做运算
        console.log(BigInt(max)+BigInt(1));
        console.log(BigInt(max)+BigInt(2));
    </script>

GlobalThis

    <script>
        // globalThis 始终指向全局对象
        console.log(globalThis);
    </script>