微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

es6 + next 系列

1、let、const 有块级代码作用域

没有预解析,不存在变量提升
不能重复定义
特殊的for循环,for循环()里面定义的let变量,只在循环体内有效
const和let差不多,只不过人家是常量,不能改变
2、解构赋值
a). 数据解构赋值:
let [a=‘abc’]=[] 解构认值(里面填写undefined和null的区别)
let [a, b=‘banana’] = [‘aaa’, undefined]; 和 let [a, b=‘banana’] = [‘aaa’, null]
b). 对象解构赋值:
let {a,b} = {a:‘apple’, b:‘banana’}
一个小坑:
let a;
{a} = {a:‘apple’} 需要写成这种 ({a} = {a:‘apple’} )

例子: 函数传参解构

let json={a:'111', b:'222'}
function fn({a, b='Strive'}){
console.log(a,b)
}
fn(json);

封装运动函数: 参数认值

function doMove({x=0, y=0}={}){
console.log(x, y)
}

doMove({x:0, y:0})
doMove({x:10})

c). 字符串解构赋值:
const [a,b,c] = ‘wel’; 平时工作用的不多
解构赋值的用途:
交换两个数的位置
函数返回多个值
提取 JSON 数据
import 模块的时候解构
封装框架的认参数
3、字符串模板
``:字符串
${}:引用变量

var message = SaferHTML`<p>${bonk.sender} 向你示好。</p>`;

好处支持换行
字符串查找:
ES5 -> str.indexOf()
ES6 -> str.includes(xx)
str.startsWith(xx) 判断字符串开头
str.endsWith(xx) 判断字符串结尾
str.repeat(3) 字符串的复制
字符串填充(补全):padStart(头部)和padEnd(尾部)
4、函数的变化 扩展运算符和rest运算符
函数参数的认值

function fn(a='欢迎',b='mmr'){
console.log(a, b);
}

函数参数变量认是声明的,不能再用let或者const声明

function foo(x = 5) {
let x = 1; // error
const x = 2; // error
}

配合对象解构,如果不认赋值会报错

function foo({x, y = 5} = {}) {
console.log(x, y);
}
foo() // undefined 5
reset参数, (剩余参数), 必须放到最后

例子1: function fn(…args){ //求和,不用arguments了,为何,因为有箭头函数}
fn(1,2,3,4,5)
例子2: 排序

function fn(...numbers){
return numbers.sort();
}
fn(3,2,-10,90,100);

箭头函数:=>
注意:
this问题,就是定义时所在的对象,而不是使用时所在的对象,之前有过开发js的经验,都知道this简直令人丧心病狂
不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误
不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
//函数传入数组

function fn(a,b,c){
console.log(a,b,c);
}
fn(...[1,2,3])

例子: 复制数组
循环
Array.from()
[…arr1]
rest运算符:
function fn(arg1,…args){}

5、数组

.forEarch((cur,index,arr)=>{})
.map(()=>{return ...}) 
以上可接受两个参数(循环函数,this指向谁)

.filter(()=>{return ...}) 返回为true则留下,过滤
.some(()=>{return ...}) 类似查找,数组里面某个元素符合条件,返回true
.every(()=>{return ...})类似查找,数组里面所有元素符合条件,返回true

.reduce((prev,cur,index,arr)=>{})从左往右,求数组和\阶乘
.reduceRight(()=>{})从右往左

for...of...循环
for(let val of arr)
for(let index of arr.keys())
for(let val of arr.entries())
for(let [key,val] of arr.entries())

ES2017新增运算符:幂
老:Math.pow(x*y)
新:x**y

扩展运算符
let a = [1,2,3]
let b= […a]

Array.from(类数组):把类数组,对象转化成数组

Array.of()把一组值转化为数组
Array.find(()=>{return …}) 查找,返回第一个符合条件的数组成员,如无返回undefined

Array.findindex(()=>{return …})查找,返回第一个符合条件的数组成员的位置,如无返回-1

Array.fill(填充,开始,结束)填充

ES2016新增

Array.indexOf()
Array.includes(xx)

6、对象简洁语法json

对象简洁语法

Object.is() 比较两个值是否相等

Object.assign(目标对象{},source1,source2) 合并对象,克隆对象(复制)

Object.keys()
Object.values()

Object.entries()

ES2018 对象支持

7、Promise承诺
作用:解决异步问题

传统方式:回调函数,事件

语法:

let promise = new Promise(function(resolve,reject){
//resolve成功
//reject失败
})
promise.then(success,fail)

promise.catch(err=>{//发生错误的别名
    console.log(err)
})

promise.resolve(resolve=>{//成功
    console.log(resolve)
})

promise.reject(reject=>{//失败
    console.log(reject)
})


promise.all(...).then()   all必须确保所有的promise对象都是resolve状态

promise.race(...).then()  race只要有一个成功即可

8、模块化
export:负责模块化输出
import:负责模块话引入

export和export default
输出单个值,使用export default
输出多个值,使用export
export default与普通的export不要同时使用

模块输出一个函数,首字母应该小写;模块输出一个对象,首字母应该大写

9、类
面向对象,类
属性
方法

函数模拟

人:Person

Person.prototype.showName

ES5之前

function Person(){

}
Person.prototype.showName=function(){}

ES6中的变形

let aaa='haha'
class Person{
  constructor(name,age){//构造函数方法调用new自动执行
    console.log("asdas",${name},${age})
 }//无逗号
  showName(){
   return '年龄:${this.age}'
 }

[aaa](){//函数名可以为变量,json也可
     return '哈哈哈...' 
}

}
let p1 =new Person('xx',18)
console.log(p1.showName(),p1.haha(),p1[aaa])

注意:
1、ES6无提升(预解析),ES5
2、this

this矫正方法
fn.call
fn.apply
fn.bind

class里面取值函数(getter),存值函数(setter)
静态方法(static),就是类身上的方法
子类extends继承父类方法

super
第一种情况,super作为函数调用时,代表父类的构造函数
第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类

10、symbol & generator
symbol:新的原始数据类型,Undefined、Null、Boolean、String、Number、对象(Obiect)、function
let syml= Symbol(‘aaa’)//不用new,返回是唯一值(做key,定义唯一或者私有的)
Object.getownPropertySymbols(a):取一个对象上的Symbol属性
Reflect.ownKeys(a):返回所有类型的属性
generator函数

生成
解决异步,深度嵌套,async,可以保存状态
语法:

function *show(){
    yield
    //产出
}//加*号区分是generator函数

let g1=show()
g1.next().value.then(res=>{})

11、async 与 await
async function fn(){//表示异步,这个函数里面有异步任务
let f1= await readFile(‘data/a.txt’)//表示后面结果要等待



}
fn()

async 特点:
1、await只能放到async函数
2、更加语义化
3、await后面可以是promise对象,可以是数字,字符串,布尔
4、async函数返回的是一个promise对象
5、只要await语句后面Promise状态变成reject,那么整个async函数会终端执行

如何解决async抛出异常影响后续代码
try{}catch(e){}
promise本身的catch

12、set与map
set

数组结构
数组
json,交叉树

set 新的数据结构

类似数组,值不能重复常用数组去重复

用法:var set = new Set([1, 2, 3, 4, 4]);
[…set]// 返回数组,不加…返回set结构本身

四个操作方法
add(value):添加某个值,返回set结构本身
delete(value):删除某个值,返回一个布尔值
has(value):返回布尔值
clear():删除所以成员,无返回值
size:属性,返回个数
set内部的元素可以遍历for…of…与forEarch

weakset,new WeakSet({})存储json
.add();初始通过add添加
.delete();
.has();

map:对象保存键值对
new Map()
.set(key,value)设置一个
.get(key) 获取一个
.delete(key)
.has(key)
.size
.clear()
for…of…方法 与 forEach()方法

WeakMap():key只能是对象

总结:
set里面是数组,不重复,没有key,没有get方法
map对JSON功能增强,key可以是任意值

13、数字(数值)变化与Math

二进制:(binary)
let a=0b01
八进制:(Octal)
let a=0o666
十六进制 #ccc
Number()、parseInt()、parseFloat()

Number对象下的方法
.isNaN()
.isFinite() 判读是不是数字
.isInteger() 判断数字书是不是整数
.isSafeInteger() 判断数字是不是安全整数
.MAX_SAFE_INTEGER 最大安全整数
.MIN_SAFE_INTEGER 最小安全整数
安全整数:-(253-1)~(253-1)

Math:
.abs()绝对值
.sqrt()平方根
.random()返回0~1随机
.trunc(number)截断
.sign()判断一个数到底是正数,负数,还是0
.cbrt()计算一个数的立方根,等同于Math.pow(n,1/3)方法
.hypot()计算所有参数平方和的平方根

14、ES2018(ES9)新增

15、Proxy的使用(代理)
用于修改某些操作的认行为
new Proxy(targer,handler)
targer:用Proxy包装的目标对象(可以是任何类型的对象,包括原生数组,函数,甚至另一个代理)。
handler:一个对象,其属性是当执行一个操作时定义代理的行为的函数

**16、什么是回调 **
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用

同步调用, 是一种阻塞式调用调用方要等待对方执行完毕才返回,它是一种单向调用
回调, 是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用, 是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户端(即调用客户端的接口)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐