ES6新特性
声明
let
不支持重复声明 没有变量函数提升 块作用域 不影响作用域链条 const
定义常量 一般常量名大写(潜规则) 块级作用域 不能修改 对声明的对象或数组,可以修改里面的值(地址值不能变) 解构赋值
let arr = [ 1 , 2 , 3 , 4 ]
let [ a, b, c, d] = arr
console. log ( a, b, c, d)
语法
模板字符串``
扩展运算符...
把数组转换成参数序列 数组合并[...[],...[]]
数组克隆let arr2 = [...arr1]
//浅拷贝 将为数组转化为新数组let arr = [...(document.querySelectAll('div'))]
对象与数组
对象
Object.is()
判断两个值是否相等,NaN
和NaN
也会相等Object.assign(obj1,obj2)
合并两个对象,后面会把前面重名的覆盖Object.setProtoTypeOf(obj,protoObj)
设置原型对象
简写
{name:name,age:age}
简写为{name,age}
函数
function(a=10){}
给形参提供默认值function([a,b]){}
function({name,age}){}
与解构赋值混用fun(a,...rest){}rest
以数组方式存储除a
以外的形实参
function fun1 ( a, ... rest ) {
console. log ( rest)
}
fun1 ( 1 , 2 , 3 )
箭头函数
()=>{}
this
值始终指向声明时的作用域(静态的)call()
也不能改变箭头函数的this
不能作为构造函数 没有arguments
变量 形参只有一个可省略()
代码体只有一句可省略{}
,默认return
这一句的结果 不适合做回调函数
symbol
是一种新类型,代表一个独一无二的值,这个值我们看不见,但在内存中存在 当作键不会被遍历到 可以转换成字符串,布尔值 语法Symbol('描述')
描述可有可无 不是构造函数
let symbol= Symbol ( '特殊值' )
let obj = {
name : 'xz' ,
[ symbol] : '密码'
}
console. log ( Object. keys ( obj) )
迭代器iterable
一些内置类型拥有默认的迭代器行为,其他类型(如 Object
)则没有,所以不能用for of
数组,字符串,map,set
都默认有迭代器行为供for of
使用,但是for in
可以用 为对象添加迭代器
let obj = {
arr : [ 1 , 2 , 3 , 4 , 5 , 6 ] ,
[ Symbol. iterator] ( ) {
let that = this
let index = 0
return {
next ( ) {
if ( index < that. arr. length) {
return { value : that. arr[ index++ ] , done : false }
} else {
return { value : undefined , done : true }
}
}
}
}
}
for ( let val of obj) {
console. log ( val)
}
[Symbol.iterator](){return 迭代器对象}
生成器
语法function *fun(){}
yield
相当于是函数暂停器,每一次执行实例.next()
函数都会在对应顺序yield
语句处暂停
function * fun2 ( arg ) {
console. log ( arg)
let a = yield 111
console. log ( a)
yield 222
yield 333
}
let iterator = fun2 ( '参数' )
console. log ( iterator. next ( ) ) 在yield 111 执行完后暂停
console. log ( iterator. next ( 'a' ) ) 在yield 222 执行完后暂停,并把'a' 当作yield 111 语句整体的返回值
console. log ( iterator. next ( ) ) 在yield 333 执行完后暂停
console. log ( iterator. next ( ) ) 执行最后剩下的语句
构造函数Promise
let promise = new Promise ( function ( resolve, reject ) {
let xhr = new XMlHttpRequest ( )
xhr. open ( 'get' , 'url' )
xhr. send ( )
xhr. onReadStateChange = function ( ) {
if ( xhr. readStates === 4 ) {
if ( ( 300 - xhr. status) <= 100 ) {
resolve ( xhr. response)
} else {
reject ( xhr. status)
}
}
}
} )
promise. then ( function ( data ) {
...
} , function ( err ) {
...
} )
.then(fun,fun1)
可以链式调用 then(()={},()={}).then()
then
的返回值为promise
对象上一个返回promise
对象的状态值决定调用下一个then
中的回调中的哪一个 详情见promise
基础 .catch(fun)
用于处理错误操作
set
里面不允许有重复的值 可用于数组去重 let set = new Set(['','','',''])
set.add()
添加set.delete()
删除set.clear()
清空set.has()
确认是否有
map
长得和对象相似,但是键值不局限于字符串 let map = new Map()
map.set(键,值)
添加map.delete(键)
删除map.get(键)
获取map.clear()
清空map.size()
返回map包含元素个数map.has(键)
确认是否有map.keys()
返回含所有键的迭代器对象map.values()
返回含所有值的迭代器对象可以for of
遍历 可以用扩展运算符
类
语法class 类名{constructor(){}}
继承语法class 子类名 extends 父类名{constructor(){super()}}
function Phone ( name ) {
this . name = name
}
function Air ( name, age ) {
Phone . call ( this , name)
this . age = age
}
let oppo = new Air ( 'oppo' , '19' )
console. log ( oppo)
class Phone {
constructor ( name ) {
this . name = name
}
fun ( ) {
console. log ( '父类' )
}
}
class Air extends Phone {
constructor ( name, age ) {
super ( name)
this . age = age
}
fun ( ) {
console. log ( '子类' ) ;
}
}
Phone. unique = '独有'
let oppo = new Air ( 'oppo' , '18' )
console. log ( oppo)
oppo. fun ( )
Number
Number.EPSILON
最小精度,小于此数判定相等Number.isFinite(1)
检查是否为有限数Number.NaN()
是否为NaN
Number.parseInt()
转换成整数Number.parseFloat()
转换成浮点数Number.isInteger()
是否为整数
Math
Math.trunc()
抹除小数Math.sign()
检查类型,以返回值判断
模块化
导入
import * as xx from 'url'
通用import {m1,m2} from 'url'
适用于统一暴露,解构赋值法import {default as xx} from 'url'
适用于默认暴露import xx from from 'url'
只适用于默认暴露 导出
export xx
export{xx,xx}
export default {}
babel
高级js
语法转换成低级js
语法方便低版本浏览器解析 具体参见webpack
基础
ES7新特性
includes
检测数组中是否包含某个值,返回布尔值
**
指数运算符,与Math.pow()
一样
ES8新特性
async函数
语法
特性
返回值为一个promise
对象 函数内return
一个非promise
对象值,那fun
的返回值为成功共promise
对象 函数内return
一个promise
对象
promise
对象的成功与失败的状态和值与fun返回的promise
对象一样
await
必须写在async
函数中 await
右侧表达式一般为promise
对象await
返回的是promise
成功的值await
返回的promise
失败了就会抛出异常,用try...catch
捕获处理
对象
Object.values(obj)
返回对象所有值构成的数组Object.entries(obj)
返回对象所有键值所构成的数组[[key,value],[key,value]]
方面转成map
Object.getOwnPropertyDescriptors(obj)
返回对象所有属性的描述对象
let obj = {
name : {
value : 'xz' ,
writable : true ,
...
}
}
ES9新特性
对象
扩展运算符…
...obj
不行,因为没有迭代器{...obj}
在这样就ok
正则扩展
命名捕获
(?<name>.*)
捕获括号中的内容除了可以用下标访问,还可以通过捕获名name获取捕获名存在exec()
返回值的groups
属性中
let str = ` da<a>dddd</a>da `
let reg = / <a>(?<name>.*)<\/a> /
console. log ( reg. exec ( str) . groups. name) ;
反向断言
/d(?=啊)/
正向断言,匹配d
后面是啊的d
/(?=<啊)d/
反向断言,匹配d
前面是啊的d
dotAll模式
.
元字符代表除了换行符的任意单个符号/./s
加了模式匹配符s
,.
就会匹配任意字符
ES10新特性
对象
Object.fromEntries()
将二维数组或map对象转为对象
字符串
str.trimStart()
清除字符串前面空格str.trimEnd()
清除字符串后面空格
数组
arr.flat(n)
将数组降低n个深度arr.flatMap(item=>[item*10])
遍历arr
并降低返回值一个深度
Symbol
symbol.prototype.description()
获取symbol
的描述
ES11新特性
类
class Phone {
name;
#age;
}
promise
Promise.all([p1,p2])p1
和p2
都成功才返回成功的promise
Promise.allSettled([p1,p2])
永远返回一个成功的promise
;p1
,p2
的状态和值都能在返回值里找到
字符串
str.match(reg)
返回值为可迭代对象,常用于批量提取内容的时候
语法
?.
可选链操作,可直接判断上一级是否存在,免去对象深度过深要进行判断
let obj = {
name : 'xz' ,
obj2 : {
name : 'xz' ,
obj3 : {
name : 'xz'
}
}
}
console. log ( obj ? ( obj. obj2 ? ( obj. obj2. obj3 ? obj. obj2. obj3. name : 0 ) : 0 ) : 0 )
console. log ( obj?. obj2?. obj3?. name)
模块化
import ( 'url' ) . then ( value => {
...
} )
大整形BigInt
let num = 100n
定义大整数BigInt(整数)
转换为大整数大整数只能和大整数运算 表示的数范围取决于内存
globalThis