目录
一、let关键字
- 不允许重复声明
- 块级作用域
- 不存在变量提升(不允许在变量声明之前使用变量)
- 不影响作用域链
二、const关键字
- 声明必须赋初始值
- 标识符一般为大写
- 不允许重复声明
- 值不允许修改
- 块级作用域
应用场景:声明对象类型使用const,声明非对象类型选择let。
三、解构赋值
解构模型分为两部分:
- 解构的源,解构赋值表达式的右边部分。
- 解构的目标,解构赋值表达式的左边部分。
const arr = ['111','222','333']
let [a,b,c] = arr
console.log(a) // '111'
console.log(b) // '222'
console.log(c) // '333'
解构赋值,如果所解构的原对象是一维数组或对象,其本质就是对基本数据类型进行等号赋值,那它就是深拷贝;如果是多维数组或对象,其本质就是对引用类型数据进项等号赋值,那它就是浅拷贝。
四、模板字符串(``)
- 字符串中可以出现换行符
- 可以使用${xxx}形式输出变量
let p = '猪猪'
let res = `${p}胖嘟嘟`
console.log(res) // 猪猪胖嘟嘟
五、简化对象写法
允许在大括号内直接写入已经定义好了的变量和函数
let name = 'Naive'
let obj = {
name,
change(){
console.log('abc')
}
}
六、箭头函数
(参数1,参数2,...)=> { }
- 如果形参只有一个,则小括号可以省略
- 函数体如果只有一条语句,则花括号可以省略,函数返回值为该条语句的执行结果
- 箭头函数this指向声明时所在作用域下this的值(this的指向不能改变)
- 箭头函数不能作为构造函数实例化
- 不能使用arguments
箭头函数适合与this无关的回调(定时器,数组的方法回调),不适合与this有关的回调(事件回调,对象的方法)
七、rest参数
引入rest参数用于获取函数的实参,用来代替arguments
function add(...args){
console.log(args)
}
add(1,2,3,4,5) // [1,2,3,4,5]
八、spread扩展运算符
扩展运算符也是三个点(...),好比rest参数的逆运算
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr = [...arr1,...arr2]
console.log(arr) // [1,2,3,4,5,6]
九、Symbol
- Symbol的值时唯一的,用来解决命名冲突的问题
- Symbol的值不能与其他数据进行运算
- Symbol定义的对象属性不能使用for...in循环遍历
- Symbol.for()方法创建的的 symbol 会被放入一个全局 symbol 注册表中。Symbol.for()并不是和每次都会创建一个新的Symbol,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个。
let s1 = Symbol('aaa');
let s1_1 = Symbol('aaa');
console.log(s1===s1_1);//false
let s2 = Symbol.for('bbb');
let s2_2 = Symbol.for('bbb');
console.log(s2===s2_2);//true
十、迭代器
Iterator接口主要供for...of消费,所有的迭代器对象都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是value,表示下一个将要返回的值;另一个是done,它是一个布尔类型的值,当没有更多可返回数据时返回true。迭代器还会保存一个内部指针,用来指向当前集合中值的位置,每调用一次next()方法,都会返回下一个可用的值。
如果在最后一个值返回后再调用next()方法,那么返回的对象中属性done的值为true,属性value则包含迭代器最终返回的值,这个返回值不是数据集的一部分,它与函数的返回值类似,是函数调用过程中最后一次给调用者传递信息的方法,如果没有相关数据则返回undefined。
工作原理如下:
- 创建一个指针对象,指向当前数据结构的起始位置
- 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
- 接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员
- 每调用next方法返回一个包含value和done属性的对象
function createIterator(items){
var i = 0
return {
next : function(){
var done = (i >= items.length)
var value = !done ? items[i++] : undefined
return {
done : done,
value : value
}
}
}
}
var iterator = createIterator([1,2,3])
console.log(iterator.next()) // {value:1,done:false}
console.log(iterator.next()) // {value:2,done:false}
console.log(iterator.next()) // {value:3,done:false}
console.log(iterator.next()) // {value:undefined,done:true}
//之后的所有调用
console.log(iterator.next()) // {value:undefined,done:true}
十一、生成器
生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的关键字yield。星号可以紧挨着function关键字,也可以在中间添加一个空格。
- * 的位置没有限制
- 生成器函数返回的结果十迭代器对象,调用迭代器对象的next方法可以得到yield语句后的值
- yield相当于函数的暂停标记,也可以认为十函数的分隔符,每调用一次next方法,执行一段代码
- next方法可以传递实参,作为yield语句的返回值
- 可以解决回调地狱的问题
function one(){
setTimeout(()=>{
console.log(111)
iterator.next()
},1000)
function two(){
setTimeout(()=>{
console.log(222)
iterator.next()
},1000)
function three(){
setTimeout(()=>{
console.log(333)
iterator.next()
},1000)
function *gen(){
yield one()
yield two()
yield three()
}
let iterator = gen()
iterator.next() // 111 222 333
十二、Promise
1、Promise对象有三种状态:
- pending(待定):初始状态,既没有被兑现,也没有被拒绝。
- fulfilled(已兑现):意味着操作成功完成。
- rejected(已拒绝):意味着操作失败。
2、resolve、reject和then方法
resolve是对Promise成功时候的回调,它把Promise的状态修改为fulfilled;reject是对Promise失败时候的回调,它把Promise的状态修改为rejected。
Promise对象中的then方法,可以接收构造函数中处理的状态变化,并分别对应执行。then方法有2个参数,第一个参数接收resolved状态的执行,第二个参数接收rejected状态的执行。
function promiseClick(){
let p = new Promise(function(resolve,reject){
setTimeout(function(){
var num = Math.ceil(Math.random()*20) //生成1-10随机数
console.log('随机数生成值:',num)
if(num<=10){
resolve(num)
}else{
reject('数字大于10了即将执行失败回调')
}
},1000)
})
return p
}
promiseClick().then(
function(data){
console.log('resolved成功回调')
console.log('成功回调接受的值:',data)
},function(reason){
console.log('rejected失败回调')
console.log('失败执行回调抛出失败原因:',reason)
}
}
3、catch方法
与Promise对象方法then方法并行的一个方法就是catch,与try...catch类似,catch就是用来捕获异常的,也就是和then方法中接受的第二参数rejected的回调时一样的。
function promiseClick() {
let p = new Promise(function (resolve, reject) {
setTimeout(function () {
var num = Math.ceil(Math.random() * 20) //生成1-10的随机数
console.log("随机数生成的值:", num)
if (num <= 10) {
resolve(num)
} else {
reject("数字大于10了即将执行失败回调")
}
}, 2000)
})
return p
}
promiseClick()
.then(function (data) {
console.log("resolved成功回调")
console.log("成功回调接受的值:", data)
})
.catch(function (reason, data) {
console.log("catch到rejected失败回调")
console.log("catch失败执行回调抛出失败原因:", reason)
})
4、all方法
与then同级的另一个方法,all方法,该方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后并且执行结果都是成功的时候才执行回调。
function promiseClick1() {
let p = new Promise(function (resolve, reject) {
setTimeout(function () {
var num = Math.ceil(Math.random() * 20) //生成1-10的随机数
console.log("随机数生成的值:", num)
if (num <= 10) {
resolve(num)
} else {
reject("数字大于10了即将执行失败回调")
}
}, 2000)
})
return p
}
function promiseClick2() {
let p = new Promise(function (resolve, reject) {
setTimeout(function () {
var num = Math.ceil(Math.random() * 20) //生成1-10的随机数
console.log("随机数生成的值:", num)
if (num <= 10) {
resolve(num)
} else {
reject("数字大于10了即将执行失败回调")
}
}, 2000)
})
return p
}
function promiseClick3() {
let p = new Promise(function (resolve, reject) {
setTimeout(function () {
var num = Math.ceil(Math.random() * 20) //生成1-10的随机数
console.log("随机数生成的值:", num)
if (num <= 10) {
resolve(num)
} else {
reject("数字大于10了即将执行失败回调")
}
}, 2000)
})
return p
}
Promise.all([promiseClick3(), promiseClick2(), promiseClick1()]).then(
function (results) {
console.log(results)
}
)
5、race方法
all是等所有的异步操作都执行完了再执行then方法,那么race方法就是相反的,谁先执行完成就先执行回调。先执行完的不管是进行了race的成功回调还是失败回调,其余的将不会再进入race的任何回调。
Promise.race([promiseClick3(), promiseClick2(), promiseClick1()]).then(
function (results) {
console.log("成功", results)
},
function (reason) {
console.log("失败", reason)
}
)
6、Promise可以解决回调地狱的问题(回调地狱是指层层嵌套的异步函数的操作)
十三、Set和WeakSet
1、Set
成员的值都是唯一的,没有重复的值。Set结构的属性如下:
- size():返回成员总数
- add():添加某个值,返回Set结构本身
- delete():删除某个值,返回一个布尔值,表示是否删除成功
- has():返回一个布尔值,表示该值是否为Set的成员
- clear():清除所有成员,没有返回值
2、WeakSet
WeakSet结构与Set类似,也是不重复的值的集合。但是,它与Set有两个区别:
- Weak Set的成员只能时对象,而不能是其他类型的值
- WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
十四、Map和WeakMap
1、Map
Map是键值对的集合,包含的属性有:
- size():返回成员总数
- set(key,value):设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。
- get(key):读取对应的键值,如果找不到key,返回undefined
- has(key):返回一个布尔值,表示某个键是否在当前Map对象之中
- delete(key):删除某个键,返回true。如果删除失败,返回false。
- clear():清除所有成员,没有返回值
2、WeakMap
WeakMap和Map的区别:
- WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
- WeakMap的键名所指向的对象,不计入垃圾回收机制。它的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。
十五、Class类
- constructor定义构造函数初始化
- extends继承父类
- super调用父级构造方法
- static定义静态方法和属性
- 父类方法可以重写
十六、数值扩展
- 二进制0b 八进制0o
- Number.isFinite() 用来检查一个数值是否为有限的;Number.isNaN() 用来检查一个值是否为NaN
- Number.parseInt()与Number.parseFloat()
- Math.trunc 用于去除一个数的小数部分,返回整数部分
- Number.isInteger() 用来判断一个数值是否为整数
十七、对象扩展
- Object.is比较两个值是否严格相等,与===行为基本一致
- Object.assign 对象的合并,将源对象的所有可枚举属性,复制到目标对象
- __proto__、setPrototypeOf,setPrototypeOf可以直接设置对象的原型
十八、模块化
模块功能主要由两个命令构成:export和import
- 1、export命令用于规定模块的对外接口
- 2、import命令用于输入其他模块提供的功能