深入理解es6(下)

摘要:
f.has))//{1}2、Map()Map数据结构,它类似于对象,但是键的范围不限于字符串,可以为各种类型的值//key是对象letmap=newMap();letobj={msg:'hello'}//map设置和获取值map.setmap.setmap.get//'content'//size属性map.size//2//返回一个布尔值,表示某个键是否在当前Map对象之中map.has//true//删除某个键,返回true。如果删除失败,返回falsemap.delete//true//清除所有成员,没有返回值。functiontimeout{returnnewPromise;}asyncfunctionasyncTimeSys(){awaittimeout;console.log("第一层异步结束!")awaittimeout;console.log("第四层异步结束!

一、symbol

javascript基本数据类型:
null、undefined、number、boolean、string、symbol
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值(随机生成的一个永远都不会重复的id串)

let s = Symbol();

typeof s
// "symbol"

二、Set和Map

1、Set()

是es6提供的一种新的数据结构,类似于数组,但是set里面的数据具有唯一性

const s = new Set();

Set实例的属性和方法

let set = new Set([1, 2, 3, 4, 4]);
//返回实例的总数
set.size //5

//操作方法
set.add(value) //添加某个值,返回结构本身
set.delete(value)  //删除某个值,返回一个布尔值
set.has(value) //返回一个布尔值,表示是否为set成员
set.clear() //清空所有成员,无返回值

//遍历方法
keys(),values(),entries()
// 注:Set 结构没有键名,只有键值,所以keys(),values()的行为完全一致

set对象的操作

// 数组去重
let arr = [1, 2, 3, 4, 4];
[...new Set(arr)]; // [1, 2, 3, 4]

//并集
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
let union = new Set([...a, ...b]); // {1, 2, 3, 4}

//交集
let c = new Set([1, 2, 3]);
let d = new Set([4, 3, 2]);
let intersect =new Set([...c].filter(x => d.has(x))) // {2, 3}

//差集
let e = new Set([1, 2, 3]);
let f = new Set([4, 3, 2]);
let difference =new Set([...e].filter(x => !f.has(x))) // {1}

2、Map()

Map 数据结构,它类似于对象,但是键的范围不限于字符串,可以为各种类型的值(对象或者原始值)

//key 是对象
let map = new Map();
let obj = {msg:'hello'}

//map设置和获取值(用一个对象作为了键)
map.set(obj, 'content')
map.set('key', 'value')
map.get(obj) // 'content'

//size 属性
map.size //2

//返回一个布尔值,表示某个键是否在当前 Map 对象之中
map.has(obj)  //true

//删除某个键,返回true。如果删除失败,返回false
map.delete(obj) //true

//清除所有成员,没有返回值。
map.clear()

//遍历方法
keys(),values(),entries()
//注:Map 的遍历顺序就是插入顺序

map对象的操作

//Map 与 Array的转换
//map构造函数 可以与一个 二维键值对数组 相互转换
let arr = [
  ['key1', 'val1'],
  ['key2', 'val2'],
]
let map = new Map(arr);
let outArr = Array.from(map);

//Map的克隆
let map1 = new Map(arr);
let cloneMap1 = new Map(map1);

//Map的合并
//如果有重复的键值,则后面的会覆盖前面的
let arr2 = [
  ['key1', 'val1'],
  ['key2', 'val2'],
  ['key3', 'val3'],
]
let first = new Map(arr);
let second = new Map(arr2);
let merged = new Map([...first,...second]);

三、promise

是异步编程的一种解决方案,可以处理多个异步请求的执行顺序等

//基本用法
let p1 = function(){
    return new Promise((resolve,reject)=>{
        //异步操作1,成功执行resolve函数,失败执行reject函数
    })
}
let p2 = function(){
    return new Promise((resolve,reject)=>{
        //异步操作2,成功执行resolve函数,失败执行reject函数
    })
}

p1.then((data)=>{
    console.log('成功的回调')
},(err)=>{
    console.log('失败的回调')
})

//Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
let p = Promise.all([p1,p2])
p.then((data)=>{
    //两个都执行了resolve方法
}).catch((err)=>{
    //一个不满足就执行这里
})

四、Generator函数 和 async函数

1、Generator函数

ES6 提供的一种异步编程解决方案
操作繁琐,需要手动调用next方法,不常用

function* test(){
    yield 'hello'; //yield可以为一个异步函数的返回结果
    yield 'world';
        ...
}

let result = test();
console.log(result.next()); // { value: 'hello', done: false }
console.log(result.next()); // { value: 'world', done: false }
console.log(result.next()); // { value: undefined, done: true }

2、async函数(es7)

它就是 Generator 函数的语法糖
async函数返回一个 Promise 对象,可以使用then方法添加回调函数。

function timeout(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms, "finish");
  });
}
async function asyncTimeSys(){
    await timeout(1000);
    console.log("第一层异步结束!")
    await timeout(1000);
    console.log("第二层异步结束!")
    await timeout(1000);
    console.log("第三层异步结束!")
    await timeout(1000);
    console.log("第四层异步结束!")
    await timeout(1000);
    console.log("第五层异步结束!")
    return "all finish";
}
asyncTimeSys().then((value)=>{
    console.log(value);
});

五、Class类

通过class关键字,可以定义类

1、基本用法

//es6之前定义类(构造函数)
function Person(name,age){
    this.name = name;
    this.age = age;
}
let student = new Person('小明',18);
//定义共有方法
Person.prototype.say = function(){
    return this.name +'今年'+ this.age;
}
console.log(student.say()) //小明今年18

//通过class定义类
class Person {
    //静态属性,直接通过Person.type拿到值
    static type = '地球人';
    //静态方法,通过Person.eat()调用
    static eat(){
        console.log('吃点啥');
    }

    //构造器定义类的属性
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    //定义共有方法
    say(){
        return this.name +'今年'+ this.age
    }
}
let student = new Person('小明',18)
console.log(student.say()) //小明今年18

2、class的继承

可以通过extends关键字实现继承

class Person {
    constructor(name){
        this.name = name;
    }
    say(){}
}

class Teachaer extends Person{
    constructor(name,job){
        super(name); //需要用到this,则必须执行一次super函数,
        this.job = job;
    }
    work(){
        return `${this.name}的工作是${this.job}`;
    }
}
let xiaoming = new Teachaer('小明','教书')
console.log(xiaoming.work()) //小明的工作是教书

六、Module语法

ES6之前已经出现了js模块加载的方案,最主要的是CommonJS(用于服务器端,如nodeJS)和AMD规范(用于浏览器,如requireJS)

1、export 导出

export用于对外输出本模块(一个文件可以理解为一个模块)变量的接口

//1、一个一个的导出
//导出多个变量
export var name = "小明";
export var age = 18;
//导出方法
export function say(){}
//导出类
export class Person{}

//2、多个一起导出
let a = 1;
let b = 2;
let c = 3;
export { a, b, c }
//通过向大括号中添加 a、b、c 变量并且export输出,就可以将对应变量值以 a、b、c 变量标识符形式暴露给其他文件而被读取到

2、import 导入

import用于在一个模块中加载另一个含有export接口的模块。

//1、引入所有成员
import * as items from '模块路径'
//注:* 代表所有,as后面跟别名

//2、引入指定成员
import { a, b } from '模块路径'

3、export default 导出默认成员

一个模块只能有一个export default

var name = '小明'
export default name;

//引入default成员
import name from '模块路径'

免责声明:文章转载自《深入理解es6(下)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JavaScript 引用类型 ( 5章 )面向接口编程的基本原则下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

CAS单点登录------未认证授权服务

问题背景:之前我使用的127.0.0.1进行CAS直接url进行过滤!后来我用nginx进行反向代理出现问题:如下图第一眼,就在内心想,草这什么鬼!调试了五分钟发现还是不行!  网上各种教程!  半小时过去了!我吧配置文件自己看看!    出现这样问题:原因是CAS 的服务认真之前先有个REgx的正则判断,目录如上看这个正则时候,我瞬间明白了,我下面这个问题...

Idea常用插件整合

官方网站:https://plugins.jetbrains.com/plugin/228-sql-query-plugin6.IdeaVim基于IntelliJ的Vim仿真插件。注意:如果打开WebInspector,那么CSS/JavaScript同步和元素高亮显示不起作用“pluginisdebuggingthistab”信息栏的可用性问题官方网站:h...

arcgispro 计算字段示例

使用两个或四个空格来定义每个逻辑级别。Python计算表达式字段将使用感叹号(。简单计算简单字符串示例一系列Python字符串函数支持使用字符串。字符串字段中的字符可以通过索引和拆分操作访问“”bcd“”Python还支持使用format()方法的字符串格式!)常用Python字符串操作简单数学示例Python提供了处理数字的工具。...

10 TCP限流技术

TCP流限制的原因是接收方可以完全接受消息,以确保数据安全而不会丢失。首先,窗口机制引入了发送方和接收方都有一个窗口。当发送方发送数据时,将发送落入窗口中的数据。当接收器接收到数据时,落入接收器窗口的数据将被接受。可以看出,流量会受到窗口大小II的限制。滑动窗口技术1TCP滑动窗口技术通过动态改变窗口大小来调整两台主机之间的数据传输。...

antd Tabs组件动态加载组件内容

Tabs的TabPane子组件不支持将属性传递给Component,并且官方示例的TabPane内容仅为简单文本。...

NFC应用于公交卡

由于历史遗留,NFC的兼容性实在太差。一个完备的NFC产品,应该包括三个部分:NFC硬件、统一的系统接口支持、App。这种情况下,手机NFC相当于公交公司的读卡和写卡器。...