cjsryblogs

es6特性(2)

测试es6特性(2)

目录

es6特性(2)

1.promise对象

Promise 是 ES6 引入的异步编程的新解决方案。

语法上 Promise 是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。

(1)promise对象的声明格式

成功:

const p=new Promise((resolve, reject) => {
    setTimeout(() => {
        let data='成功读取数据';
        resolve(data);

        //let error='读取数据失败';
        // reject(error);
    }, 1000);
});
p.then((value) => {
    console.log(value);
}).catch(reason => {
    console.error(reason);
});

img
失败:

const p=new Promise((resolve, reject) => {
    setTimeout(() => {
        // let data='成功读取数据';
        // resolve(data);

        let error='读取数据失败';
        reject(error);
    }, 1000);
});
p.then((value) => {
    console.log(value);
}).catch(reason => {
    console.error(reason);
});

img

(2)promise读取文件

//引入fs模块
const fs = require('fs');

//调用方法读取文件
// fs.readFile('./为学.md', (err, data) => {
//     if (err) throw err;
//     console.log(data.toString());
// })

//使用Promise封装读取文件
const p = new Promise((resolve, reject) => {
    fs.readFile('./为学.md', (err, data) => {
        if (err) {
            reject(err);
        } else {
            resolve(data);
        }
    });
});
p.then(function(value){
    console.log(value.toString());
},function(reason){
    console.error('读取失败');
});

img

(3)promise封装ajax请求

//发送AJKX请求
//接口地址:https://api.apiopen.top/api/getTime

const p = new Promise((resolve,reject) =>{
    //1.创建对象
    const xhr = new XMLHttpRequest();
    //2.初始化
    xhr.open('GET', 'https://api.apiopen.top/api/getTime', true);

    //3.发送请求
    xhr.send();

    //4.绑定事件,处理响应结果
    xhr.onreadystatechange = function() {
        //判断
        if (xhr.readyState === 4) {
            //判断状态码200-299
            if (xhr.status >= 200 && xhr.status < 300) {
                //请求成功
                resolve(xhr.response);
            }else{
                //请求失败
                reject('请求失败,状态码:' + xhr.status);
            }
        }
    }
})
p.then((value) => {
    console.log(value);
}, reason => {
    console.error(reason);
})

img

(4)promise.then方法

const p = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('成功读取数据');
        // reject('读取数据失败');
    }, 1000);
});
//调用then方法 then方法的返回结果时promise对象,对象状态由回调函数的执行结果决定
const result = p.then(value => {
    console.log(value);
    //1.如果回调函数执行返回的结果是非Promise对象,状态为fulfilled(成功),则返回值为对象的成功的值
    //return 123;
    //2.返回一个Promise对象,则返回值为这个Promise对象的结果,包括状态
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('异步操作成功');
        }, 2000);
    //3.抛出错误,返回状态一定为rejected(失败)
    //throw '出错了!';
    });
},reason => {
    console.warn(reason);
});
console.log(result);

img

2.es6集合set及其api

ES6 提供了新的数据结构 Set(集合)

类似于数组,但成员的值都是唯一的,集合实现了 iterator 接口,所以可以使用『扩展运算符』和[for…of…]进行遍历

set类似于数学集合,元素不允许相同,自动去除相同的元素

(1)set的声明格式及api

//声明一个set
let s=new Set(['1','2','3','4','1']);
console.log(s);
//元素个数
console.log(s.size);
//添加元素
s.add('5');
console.log(s);
//删除元素
s.delete('1');
console.log(s);
//判断元素是否存在
console.log(s.has('2'));
//清空元素
s.clear();
console.log(s);
//遍历元素
for(let v of s) {
    console.log(v);
}

img

(2)使用set的实例

let arr=[1,2,3,4,5,4,3,2,1];        
//数组去重
let result = [...new Set(arr)];
console.log(result);
//交集
let arr2=[3,4,5,6,7,6,5];
// let result2 = [...new Set(arr)].filter(item =>{
//     let s2=new Set(arr2);
//     if(s2.has(item)) {
//         return true;
//     }else {
//         return false;
//     }
// });
//等价于
let result2 = [...new Set(arr)].filter(item => new Set(arr2).has(item));
console.log(result2);

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

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

img

3.es6map及其api

类似于对象,是键值对的集合,键可以是任意类型

(1)map的声明格式及api

//声明map
let m = new Map([
    ['name', 'sry'],
    ['age', 18]
]);
//添加元素set
m.set('school', 'erzhong');
m.set('change', function() {
    console.log('我们可以改变你!');
});

let key={
    part:'xiaoqu'
}
m.set(key, ['北京','上海', '广州']);
console.log(m);

//元素个数size
console.log(m.size);

//删除元素delete
m.delete('age');
console.log(m);

//获取get
console.log(m.get('name'));
console.log(m.get(key));

//遍历for...of

for(let v of m) {
    console.log(v);
}//输出为数组
for(let [k, v] of m) {
    console.log(k, v);
}

//判断元素是否存在has
console.log(m.has('name'));

//判断清空clear
m.clear();
console.log(m);

img

4.class类

ES6 引入了类的概念,使用 class 关键字来定义类。

(1)class的声明类

//传统es5通过构造函数实例化对象
//手机
function Phone(brand, price) {
    this.brand = brand;
    this.price = price;
}
//添加方法
Phone.prototype.call = function() {
    console.log('我可以打电话');
}

//实例化对象
let huawei = new Phone('华为', 5999);
huawei.call();
console.log(huawei);

//class
class tele {
    //构造函数 名字不能修改
    constructor(brand, price) {
        this.brand = brand;
        this.price = price;
    }

    //添加方法 方法必须使用该语法,不能使用es5的对象完整形式
    call() {
        console.log('我可以打tele');
    }
}

let apple = new tele('苹果', 10000);
apple.call();
console.log(apple);

img

(2)class的静态成员

class Phone{
    //静态属性 属于类,不属于实例
    static name='手机';
    static change(){
        console.log('我可以改变世界');
    }
}

let huawei = new Phone();
console.log(huawei.name);
console.log(Phone.name);

img

(3)class的继承

传统es5:

//传统es5的实例继承
function Phone(brand, price) {
    this.brand = brand;
    this.price = price;
}
Phone.prototype.call = function() {
    console.log('我可以打电话');
}

function SmartPhone(brand, price, color,size) {
    //继承父类的属性
    Phone.call(this, brand, price);
    this.color = color;
    this.size = size;
}
//设置子集构造函数的原型
SmartPhone.prototype = new Phone();

SmartPhone.prototype.photo = function() {
    console.log('我可以拍照');
}
SmartPhone.prototype.play = function() {
    console.log('我可以玩游戏');
}

const chuizi = new SmartPhone('锤子', 1999, '黑色', '6.0');
console.log(chuizi);
chuizi.call();
chuizi.photo();
chuizi.play();

img

class继承:

//class继承
class Phone {
    constructor(brand, price) {
        this.brand = brand;
        this.price = price;
    }
    call() {
        console.log('我可以打电话');
    }
}

class SmartPhone extends Phone {
    constructor(brand, price, color, size) {
        super(brand, price); //调用父类的构造函数
        this.color = color;
        this.size = size;
    }
    photo() {
        console.log('我可以拍照');
    }
    play() {
        console.log('我可以玩游戏');
    }
}

const chuizi = new SmartPhone('锤子', 1999, '黑色', '6.0');
console.log(chuizi);
chuizi.call();
chuizi.photo();
chuizi.play();

img

(4)子类对父类方法的重写

class Phone {
    constructor(brand, price) {
        this.brand = brand;
        this.price = price;
    }
    call() {
        console.log('我可以打电话');
    }
}

class SmartPhone extends Phone {
    constructor(brand, price, color, size) {
        super(brand, price); //调用父类的构造函数
        this.color = color;
        this.size = size;
    }
    //必须完全重写父类同名方法
    call() {
        console.log('我可以打智能电话');
    }
}

const chuizi = new SmartPhone('锤子', 1999, '黑色', '6.0');
console.log(chuizi);
chuizi.call();

img

(5)get和set

//get和set方法
class Phone {
    get price() {
        console.log('获取价格');//执行到get时自动调用
        return 'iloveyou';//返回值即为prise属性的值
    }
    set price(value) {
        console.log('设置价格');//执行到set时自动调用
    }
}
let s=new Phone();
console.log(s.price); 
s.price = 1000; //设置价格时自动调用set方法

5.数值扩展

(1)最小精度

console.log(0.1+0.2);
console.log(0.1+0.2===0.3); //false,浮点数精度问题
//Number.EPSILON是最小的精度误差
function isEqual(a, b) {
    if (Math.abs(a - b) < Number.EPSILON){
        return true
    }else{
        return false
    }
}

img

(2)二进制和八进制

分别用前缀 0b(2) 0o(8) 和 0x(16) 表示

let b=0b1010;
let o=0o0777;
let x=0xff;
console.log(b,o,x);

img

(3)Number.isFinite() , Number.isNaN()

Number.isFinite()检测数值是否有限
Number.isNaN()检测数值是不是NAN

console.log(Number.isFinite(100));
console.log(Number.isFinite(100/0));

//NaN 是 JavaScript 中的一个特殊值,表示 "Not a Number"(不是一个数字)。
// 它出现在数学运算无法产生有效数字结果时。
console.log(Number.isNaN(123));
console.log(Number.isNaN('abc'));

img

(4)Number.parseInt() 与 Number.parseFloat()

Number.parseInt() 与 Number.parseFloat()字符串转整数和浮点数
自动截取字符串中的数字

console.log(Number.parseInt('5201314iloveyou'));
console.log(Number.parseFloat('3.1415926神奇'));

img

(5)Number.isInteger() 与 Math.trunc()

Number.isInteger()判断是否时整数
Math.trunc()去除一个数的小数部分

console.log(Number.isInteger(5));
console.log(Number.isInteger(2.5));

console.log(Math.trunc(-1.1));
console.log(Math.trunc(1.1));

img

(6)Math.sign()

Math.sign()判断一个数是正数,负数还是0

console.log(Math.sign(1.1));
console.log(Math.sign(-1.1));
console.log(Math.sign(0));

img

6.对象扩展

(1)Object.is()

Object.is()判断两个值是否完全相等

console.log(Object.is(120,120));
//类似于===,但有区别
console.log(Object.is(NaN,NaN));
console.log(NaN===NaN);

img

(2)Object.assign()对象的合并

const config1={
    host:'localhost',
    port:3306,
    name:'root',
    pass:'root'
}

const config2={
    host:'http://baidu.com',
    port:33060,
    name:'sry',
    pass:'ilovefyou'
}

Object.assign(config1,config2)
console.log(config1);
console.log(config2);
//Object.assign(a,b)b会将a覆盖

img

(3)Object.setPrototypeOf()设置原型对象

const school={
    name:'erzhong'
} 
const cities={
    xiaoqu:['北京','上海','深圳']
}
Object.setPrototypeOf(school,cities)
console.log(school);
//获取原型
console.log(Object.getPrototypeOf(school));

img

7.模块化语言

模块功能主要由两个命令构成:export 和 import。

export 命令用于规定模块的对外接口

import 命令用于输入其他模块提供的功能

1)export暴露类型

(1)分别暴露直接调用

//mkh.html

<body>
    <script type="module">
        //引入 mkh.js 模块
        import * as mk from './mkh.js'
        console.log(mk);
        
    </script>

</body>
//mkh.js

export let school ='erzhong';

export function teach(){
    console.log('我们可以被调用');
}

img

(2)统一暴露

//mkh.html

<body>
    <script type="module">
        //引入 mkh.js 模块
        import * as mk1 from './mkh.js'
        // console.log(mk1);

        //引入 mkh2.js 模块
        import * as mk2 from './mkh2.js'
        console.log(mk2);
    </script>

</body>
//mkh2.js

let school ='erzhong';

function findjob(){
    console.log('我们可以帮助你找工作!');
    
}

//
export {school,findjob};

img

(3)默认暴露

//mkh.html

<body>
    <script type="module">
        //引入 mkh.js 模块
        import * as mk1 from './mkh.js'
        // console.log(mk1);

        //引入 mkh2.js 模块
        import * as mk2 from "./mkh2.js";
        //console.log(mk2);

        //引入 mkh3.js 模块
        import * as mk3 from "./mkh3.js";
        console.log(mk3);
        //调用需要多一个.default
        mk3.default.change();
    </script>

</body>
//mkh3.js

export default {
    school:'erzhong',
    change : function(){
        console.log('我们可以改变你!');
    }
}

img

2)import导入类型

(1)通用导入方式

import * as mk3 from "src";
上述export均为通用导入

(2)解构赋值形式

//mkh.html

<body>
    <script type="module">
        import {school,teach} from './mkh.js'
        import {school as school2,findjob} from './mkh2.js'
        //引入相同名称可以as别名避免冲突
        console.log(school2);
        findjob();
        console.log(school);
        console.log(teach);
    </script>
</body>
//mkh.js

export let school ='erzhong';
export function teach(){
    console.log('我们可以被调用');
}
//mkh2.js

let school ='erzhong';

function findjob(){
    console.log('我们可以帮助你找工作!');
}

img

(3)简便赋值 争对默认暴露

mkh.html

<body>
    <script type="module">
        import mk3 from "./mkh3.js"
        console.log(mk3);      
    </script>
</body>
//mkh3.js

export default {
    school:'erzhong',
    change : function(){
        console.log('我们可以改变你!');
    }
}

img

posted on 2025-08-05 10:53  cjsry  阅读(8)  评论(0)    收藏  举报

导航