深入理解es6(下)
一、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(下)的更多相关文章
- 理解 ES6 Generator-next()方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 老树新芽,在ES6下使用Express
要让Express在ES6下跑起来就不得不用转码器Babel了.首先新建一个在某目录下新建一个项目.然后跳转到这个目录下开始下面的操作. 简单走起 安装babel-cli $ npm install ...
- 深度理解IIS下部署ASP.NET Core2.1 Web应用拓扑图
原文:深度理解IIS下部署ASP.NET Core2.1 Web应用拓扑图 IIS部署ASP.NET Core2.1 应用拓扑图 我们看到相比Asp.Net, 出现了3个新的组件:ASP.NET Co ...
- 前端知识体系:JavaScript基础-原型和原型链-理解 es6 中class构造以及继承的底层实现原理
理解 es6 中class构造以及继承的底层实现原理 原文链接:https://blog.csdn.net/qq_34149805/article/details/86105123 1.ES6 cla ...
- 深入理解LINUX下动态库链接器/加载器ld-linux.so.2
[ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...
- ES6下的Function.bind方法
在JavaScript的使用中,this的指向问题始终是一个难点.不同的调用方式,会使this指向不同的对象.而使用call,apply,bind等方式,可改变this的指向,完成一些令人惊叹的黑魔法 ...
- MindSpore技术理解(下)
MindSpore技术理解(下) 4 GraphEngine 由于深度学习算法需要进行大量的计算,很多公司都设计了自己的深度学习专用处理器(如谷歌的张量处理器.阿里巴巴的含光等),华为也发布了自主设计 ...
- 基于TensorRT的BERT实时自然语言理解(下)
基于TensorRT的BERT实时自然语言理解(下) BERT Inference with TensorRT 请参阅Python脚本bert_inference.py还有详细的Jupyter not ...
- 《理解 ES6》阅读整理:函数(Functions)(五)Name Property
名字属性(The name Property) 在JavaScript中识别函数是有挑战性的,因为你可以使用各种方式来定义一个函数.匿名函数表达式的流行使用导致函数调试困难,在栈信息中难以找出函数名. ...
随机推荐
- vue自定义指令导致的内存泄漏问题解决
vue的自定义指令是一个比较容易引起内存泄漏的地方,原因就在于指令通常给元素绑定了事件,但是如果忘记了解绑,就会产生内存泄漏的问题. 看下面代码: directives: { scroll: { in ...
- Java: Java终止线程的几种方式
首先说明,使用stop方法终止的方式已经在很久之前就被废弃了,在加锁的情况下有可能会造成死锁,这里不做讨论. 1. 使用标志位终止线程 在run()方法执行完毕后,该线程就终止了.但是在某些特殊的情况 ...
- android细节之android.intent.category.DEFAULT的使用
我们知道,实现android的Activity之间相互跳转需要用到Intent, Intent又分为显式Intent和隐式Intent, 显式Intent很简单,比如我在FirstActivity中想 ...
- spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比
这两天在用spring进行上传上遇到问题,今天进行了问题的排查,这个过程也增加了我看spring源码的兴趣!还是很有收获的! 首先先给A组提供了上传接口,并没有在spring的配置文件进行multip ...
- 【转载】 CUDA_DEVICE_ORDER 环境变量说明 ( ---------- tensorflow环境下的应用 )
原文地址: https://www.jianshu.com/p/d10bfee104cc ------------------------------------------------------- ...
- Nginx warn:an upstream response is buffered to a temporary file
我通过nginx下载文件,error.log中出现如下警告日志:warn:an upstream response is buffered to a temporary file . 虽然网上各种例 ...
- 使用leaflet绘制geoJson中国边界
绘制中国边界 代码如下: function drawChina() { //设置样式 var myStyle = { "color": "#00f", &quo ...
- 没有可用的软件包 xxx,但是它被其它的软件包引用了
在linux下apt安装软件,弹出这个错. 解决,更新下资源: sudo apt-get update
- IDEA代码折叠
IDEA代码折叠 觉得有用的话,欢迎一起讨论相互学习~Follow Me 选中内容-->右键 folding -->fold selection/remove region
- bladex数据字典关联基础表
一:引用import {getDeptTree} from "@/api/system/dept";二: { label: "部门id", prop: &quo ...