1、promise
promise是es6解决异步一种方案,解决了es5处理异步回调函数的回调地狱问题。它本质上是一个对象,在new对象的时候参数是一个函数,这个函数有两个形参 成功后的回调 和失败后的回调 。Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。错误回调的处理可以使用 then的第二个回调函数 还有catch 。常用的api有 then catch 还有几个常用静态方法 Promise.all 所有函数都成功才成功 Promise.race 有一个成功就成功。
es7处理异步的方法是async 和 await
<script>
//async 是一个关键字 他可以把一个普通函数 变成一个返回promise对象的函数
// await 是一个异步函数同步化的方法 就是先执行异步方法 然后必须等待着异步方法完成后在执行后面的代码
async function fun(){
console.log('一秒后看到了什么')
let res=await test()
console.log(res)
}
fun()
function test(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('hello')
},1000)
})
}
// test().then((res)=>{
// console.log(res)
// })
</script>
promise封装axios
function get(url,data={}){
return new Promise((resolve,reject)=>{
//用原生的ajax发起请求
//1、生成一个ajax的对象
var obj= new XMLHttpRequest()
//open方法 open("get/post",url,"true/flase") true异步 false是同步
obj.open("get",url,true)
//如果请求方式是get的话,需要发送一个null
obj.send(null)
//有两个属性 来标识着是否请求成功
// status 网络请求状态码 200 404 500****
// readyState 请求状态码 0到4的转换
// 0 ajax对象创建成功 但是还没有调用open 1 open以及调用完成
//2 send已经完成 3 拿到部分数据 4 拿到全部数据
//事件 onreadystatechange 标识状态码的改变
obj.onreadystatechange=()=>{
if(obj.status==200&&obj.readyState==4){
//成功了
//属性 responseText 就是从服务器返回的数据
//console.log(obj.responseText)
var dataobj=JSON.parse(obj.responseText)
resolve(dataobj)
}
}
})
}
export default{get}
promise封装post
function post(url,data={}){
return new Promise((resolve,reject)=>{
//用原生的ajax发起请求
//1、生成一个ajax的对象
var obj= new XMLHttpRequest()
//open方法 open("get/post",url,"true/flase") true异步 false是同步
obj.open("post",url,true)
//如果请求方式是post的话,需要设置一个请求头
obj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
obj.send(data)
//有两个属性 来标识着是否请求成功
// status 网络请求状态码 200 404 500****
// readyState 请求状态码 0到4的转换
// 0 ajax对象创建成功 但是还没有调用open 1 open以及调用完成
//2 send已经完成 3 拿到部分数据 4 拿到全部数据
//事件 onreadystatechange 标识状态码的改变
obj.onreadystatechange=()=>{
if(obj.status==200&&obj.readyState==4){
//成功了
//属性 responseText 就是从服务器返回的数据
//console.log(obj.responseText)
var dataobj=JSON.parse(obj.responseText)
resolve(dataobj)
}
}
})
}
async getData(){
//let res=await axios.get("data.json")
var str="username=admin&password=123456"
let res=await axios.post("http://82.156.12.132:8080/api/private/v1/login",str)
console.log(res)
}
2、新增了let const关键字
let和var的区别:
-
- let 不存在变量的提升 var有变量的提升
- let是块级作用域有效 var是全局有效
- let是不能重复声明的 var是可以重复声明的
const:
const定义的常量如果数据类型是基本数据类型 值是不能修改
const如果定义的是引用数据类型的变量值是可以修改的
3、新增了模块化
模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等。
每个模块都有自己的上下文,每一个模块内声明的变量都是局部变量,不会污染全局作用域。
每一个模块只加载一次(是单例的), 若再去加载同目录下同文件,直接从内存中读取
我们可以使用export default来将数据整体的抛出 使用import 接受这个整体
我们可以用export 将数据一个一个的抛出 通过 import {名,名} from "文件”来接收数据
js文件
const username="小三"
function fun(){
console.log('第一天上课')
}
//export default{username,fun}
export {username}
4、函数上的扩展
(增加了默认参数 增加了剩余参数 增加l箭头函数)
箭头函数与普通函数的区别:
- 箭头函数不能做构造函数 普通函数可以作为构造函数
- 箭头函数的参数需要使用不定参数来获取形参,普通函数使用arguments(伪数组:可以遍历 但是不能使用数组的方法 别入 forEach push等等)
- 普通函数的this指向是谁调用指向谁,箭头函数是在哪定义 this就指向谁
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
<script>
//别名
//let {变量:别名}={属性1:值1,属性2:值2……}
// let {username:name}={username:'小三',age:20,classname:"2206B"}
// console.log(name)
// let [a,...b]=[1,2,3,4,5,6]
// console.log(b)
// 普通函数作为构造函数 箭头函数是不可以当成构造函数的
function Person(name,age){
this.name=name;
this.age=age
}
//构造函数就是制造对象的机器
var per1=new Person('小三',10)
var per2=new Person('小四',20)
//普通函数的参数对象是arguments(是可以接受所有实参的伪数组 有length属性可以遍历 但是不能使用数组的方法) 箭头函数是rest
function fun(){
console.log(arguments)
}
//函数调用
fun(1,2,3,4,5,6)
//rest是一个真数组
const test=(...rest)=>{
console.log(rest)
}
test(1,2,3)
function fn(){
setTimeout(()=>{
// 定义时,this 绑定的是 fn 中的 this 对象
console.log(this.a);
},0)
}
window.a = 20;
//在全局中调用 对于普通函数来说 谁调用this指向就指向谁
//箭头函数 在那块2定义this指向就指向谁
//fn来说 在全局调用 所以 this指向的是全局
fn()
var obj={a:10,b:20}
fn.call(obj)
</script>
5、解构赋值
解构赋值是对赋值运算符的扩展,可以解构数组或者对象的结构数据
//let {变量:别名}={属性1:值1,属性2:值2……}
let {username:name}={username:'小三',age:20,classname:"2206B"}
console.log(name)
let [a,...b]=[1,2,3,4,5,6]
console.log(b)
6、新增了class关键字
es5的构造函数和原型创建对象
<script>
//构造函数
function Person(name,age,classname){
//属性
this.username=name
this.age=age
this.classname=classname
//方法
}
Person.prototype.say=function(){
console.log(this.username+"会说话")
}
//构造函数创建对象缺点 给每个对象的方法都开辟一个新空间 会造成空间的浪费 解决办法
//完美的解决方案是构造函数+原型模式创建对象 利用构造函数定义属性 保证每个对象的属性空间是独立的
//利用原型定义方法 来保证每个对象的方法空间是一样的 es6 的class创建对象是构造函数+原型的一个语法糖
var obj=new Person("lisi",20,"2206B")
obj.say()
var per=new Person('wangwu',21,"2206B")
console.log(obj)
console.log(obj.say==per.say)
</script>
es6创建对象
<script>
// class 类名
class Person{
//构造函数
constructor(name,age,classname){
this.username=name
this.age=age
this.classname=classname
}
//普通方法
say(){
console.log(this.username+"爱上课笑")
}
//静态方法 需要用类名去调用
static run(){
console.log("会跑")
}
}
const per=new Person('lisi',20,'2206B')
per.say()
const per1=new Person('lisi-2',20,'2206B')
console.log(per.say==per1.say)
Person.run()
//子类继承父类
class Student extends Person{
//如果子类有自己的构造方法 那么需要在构造方法中通过super()函数调用父类的构造放啊发
constructor(name,age,classname,sno){
super(name,age,classname)
this.sno=sno
}
}
const stu=new Student('xiaosan',23,'2206B',110)
console.log(stu)
</script>
7、新增了map和set数据结构
map:
Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
Maps 和 Objects 的区别
- 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
- Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
- Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
- Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
Set 对象
Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
Set 中的特殊值
Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
- +0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
- undefined 与 undefined 是恒等的,所以不重复;
- NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
<script>
//对象
var obj={
username:'lisi',
age:20
}
console.log(obj)
console.log(Object.keys(obj))
//map
var mymap=new Map()
mymap.set(0,'hello')
console.log(mymap.size)
//set 值是唯一的 所以可以用来给数组去重
var myset=new Set()
myset.add('hello')
myset.add(0)
myset.add(3)
myset.add('hello')
console.log(myset)
//实现一个数组的去重
var arr=[1,2,3,3,2,1]
let newarr=[...new Set(arr)]
console.log(newarr)
//写一个自定义函数 实现可以对数组的去重
function remove(arr){
return [...new Set(arr)]
}
var array=[1,2,3,5,3]
console.log(remove(array))
</script>
8、新增了一些字符串和数组的函数
字符串
- includes 返回值是什么 怎么用 什么意思
- padStart()
- padEnd()
- 模板字符串
数组
- find
- findIndex
- includes
- filter
- map
- forEach
- Array.from