- Promise
- 劫持catch
我们知道Promise.catch会在函数发生错误的时候调用,catch是可以被reject回调函数劫持掉
new Promise(() => {
throw 123
}).then(() => {}, (error) => {
console.log('reject', error)
}).catch(err => {
console.log('catch', err)
})
// 以上代码不会执行catch,而是执行reject函数
- finally
当我们想在无论是resolve还是reject的情况下都去执行某段函数时可以使用finally
new Promise(() => {
resolve()
}).finally(() => {
})
- 全局劫持Promise报错
触发时机与catch一致, 若是没有绑定reject函数就会冒泡到此处执行, 优先级低于Promise本身的catch
reject>Promise自身定义的catch>全局的错误监控
window.addEventListener('unhandledrejection', (err) => {
console.log(err)
})
- then状态判断
第二个then回调函数会根据前面一个then回调函数里是否有报错来决定是调用resolve函数还是reject函数,如下例
new Promise(() => {
throw 123
}).then(() => {},() => {
console.log(133)
throw 1
}).then((err) => {
console.log(2, err)
}, (data) => {
console.log(3, data)
})
// 由于第一个then里throw一个错误
// 所以第二个then里会调用reject函数
// 若是第一个then函数里无论是resolve函数还是reject函数
// 只要没有发生错误,就还是调用下一个then的resolve函数
2.Array
- 扁平化
1.利用递归
function flatArray(array) {
return array.reduce((flat, next) => {
return flat.concat(Array.isArray(next) ? flatArray(next) : next)
}, [])
}
2.es7的flat函数
Array.flat()
- 快速生成0-9的数组
[...Array(10).keys()]
- 快速将数据填充到某些位置
new Array(length).fill(value, start, end)
- 取最后一个值
Array.slice(-1)[0]
3. Object
- 相同属性的key的取值
var object = {
a:'one',
b:'two',
a:'three'
}
// object = { a:'three', b:'two' }
相同属性的key会被后面的覆盖掉,但是key的顺序还是按照第一个来
- for of调用
for of只能用在拥有迭代器的对象里面,Array天生拥有迭代器,而Object不具备,不过我们可以自定义迭代
var person = {
name: 'Martin',
age: 25,
sex: 'man',
*[Symbol.iterator]() {
for (let key in this) {
yield [key, this[key]]
}
}
}
for (let value of person) {
console.log(value)
// [name, 'Martin']
// [age, 25]
// [sex, 'man']
}
- 隐式转换
var object = {
toString() {
console.log('toString')
},
valueOf() {
console.log('valueOf')
},
}
+object
object == 1
// 优先调用valueOf,若没有则调用toString
4.Nunber
- 进制转换
1.10进制转换为别的进制:toString(), Number需先赋值,涉及到装箱拆箱
若不懂装箱拆箱可以回页面开始查看javascript技巧(一)
2.别的进制转换10进制: parseInt(str, radius), 第二个参数是进制
- null + 1
首先解释下为什么typeof null是object
早在javascript最初版本的时候,由于考虑性能的问题采用了低位存储变量的方法
在javascript里认为二进制前3位是0的都是对象
而null的二进制表示是全0,所以它也被当做了对象
那么既然知道null是全0,而javascript的加减都是
通过二进制计算,0 + 1 = 1
- 类型加减计算方式
Number+Number=>加法
Boolean+Number=>加法
Boolean+Boolean=>加法
Number+String=>连接
String+Boolean=>连接
String+String=>连接