let const
暂存死区:在当前作用域内定义了变量,同名变量则不会去外层查找
let a = 1
{
console.log('a', a) // 报错
let a = 2
}
解构赋值
解构对象中的关键字时需要定义别名,否则会报错
let { default: d } = { default: 1 }
模板字符串 ```javascript const name = ‘jack’ const age = ‘27’ let str = ‘hello-${name}, you are${age}years old’; // 原生实现 str = str.replace(/\${([^}]*)}/g, function() { return eval(arguments[1]) })
// 自定义模板
const name = ‘jack’
const age = ‘27’
function ja() {
let strs = arguments[0] // 字符串合集
let vars = [].slice.call(arguments, 1) // 变量合集
let str = ‘’
vars.forEach((v, i) => {
str += ${strs[i]}*${vars[i]}*
})
str += strs[strs.length - 1]
return str
}
let str = jahello-${name}, you are${age}years old
;
console.log(‘str’, str) // hello-jack, you are27years old
箭头函数
1. 箭头函数简化了函数写法,没有function关键字
1. 箭头函数没有this,也没有arguments
1. 解决this的问题,this由作用域向上查找
1. var that = this
1. bind(this)、call、apply会执行
```javascript
// 取剩余参数
function fn() {
// return [].slice.call(arguments, 1)
return Array.prototype.slice.call(arguments, 1)
}
let fn2 = (...arguments) => {
return arguments.slice(1)
}
console.log(fn('x',1,2,3,4))
数组方法
reduce
// 求和
let res = [1,2,3,4].reduce((perv, next, currIndex, arr) => {
return perv + next
})
let res_two = [{num: 10}, {num:20}, {num: 30}].reduce((perv, next, currIndex, arr) => {
return perv + next.num
}, 0)
from:将类数组转换为数组
- htmlCollection、arguments、{ 0:1,1:2,2:3,length:3 }
对象方法
- assign:也是浅拷贝
- setPrototypeOf(obj1, obj2):设置obj1的原型为obj2
- 等同于ES5的 obj1.proto = obj2
- getPrototypeOf(obj1):获取原型
- 等同于ES5的 obj1.proto
super关键字获取到父属性
let obj2 = { name: 'jack' }
let obj1 = {
name: 'rose',
getPName() {
return super.name // super关键字指代原型
},
__proto__: obj2
}
console.log(obj1.getPName()) // jack
Promise
异步流程控制手段,解决异步流程问题
- generator aysnc await都是基于Promise
- koa axios redux-saga fetch都是基于Promise
Promise相关方法
- Promise只有一个参数:excutor执行器,默认new时就会调用
- Promise对象一共有三个状态:pending,fulfilled,rejected,从pending状态到任何一种状态则不会再发生改变
- Promise catch:捕获三种异常:其对象的错误具有冒泡性质,会一直向后传递,直到catch捕获
- Promise 状态未固定时,执行期间的错误
- Promise reject 所抛出的错误
- Promise 成功回调执行中的错误
- Promise.then:异步调用,指定对象状态变为 fulfilled 时的回调,then 的第二个参数也可以为捕获错误的函数,一个Promise可以then多次
- Promise finally:不取决于对象的状态,只要实例的成功或错误回调执行,则会执行finally
- Promise all:将多个Promise实例,包装返回成一个新的Promise实例,只有全部完成,或有一个发生错误时才会调用
- Promise race:与 all 类似,接收一个对象集,只返回最快成功的结果
- Promise resolve:将非对象转换为 Promise 对象,参数接收:字符串,对象,空,Promise
- Promise reject:将非对象转换为 Promise 对象,返回reject的状态
- Promise中返回的是一个普通值就会走到then中的成功回调,函数默认返回undefined,有错误就会走失败的回调 ```javascript class Promise { constructor(executor) { this.status = ‘pending’ this.value = undefined this.reson = undefined let resolve = value => { if (this.status === ‘pending’) { this.status = ‘resolved’ this.value = value } } let reject = reason => { if (this.status === ‘pending’) { this.status = ‘rejected’ this.reason = reason } } executor(resolve, reject) }
then(onFulfilled, onRejected) { if (this.status === ‘resolved’) { onFulfilled(this.value) } if (this.status === ‘rejected’) { onRejected(this.reason) } } }
module.exports = Promise
<a name="CLq81"></a>
## Object.defineProperty
```javascript
let obj = { a: 1 }
Object.defineProperty(obj, 'b', {
value: 2,
configurable: false, // 是否可以修改属性配置
writable: false, // 配置属性值才能更改
enumerable: false, // 属性是否可枚举
get: undefined,
set: undefined,
})
for (const key in obj) {
console.log('key: ', key) // a
}
obj.b = 3 // obj.b => 2