# 如何解决a标点击后hover事件失效的问题?

严格按照[L V H A]的顺序:Link => Visited => Hover => active

# 点击一个input依次触发的事件

onmouseenter => onmousedown => onfocus => onclick

# 响应式的好处

从用户的角度上出发,可以让用户获得更好的浏览体验,从开发者的角度上出发,降低了代码的重复性,开发人员可以将更多的精力放到其他部分

# null和undefined的区别

# 语义上

  • null:代表空对象
  • undefined:代表未定义的值

# 检测上

  • typeof null === "object"
  • typeof undefined === "undefined"

# 隐式类型转换上

  • Number(null) => 0
  • Number(undefined) => NaN

# 其他角度

  • 函数的默认返回值是undefined
  • 原型链的终点是null
  • JS底层中的对象机器码是以"000"开头,而null的机器码全都是0

# 冒泡排序算法和数组去重

# 冒泡排序

let arr = []
    for (let i = 0; i < arr.length; i++) {
        for (let j = 0; j < arr.length - i; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
            }
        }
    }

# 数组去重

  1. 双重for循环
  2. Set数据结构
  3. indexOf
  4. sort排序后再用for循环判断当前值是否等于上一个值和下一个值 更多的方法就在这里:JavaScript数组去重(12种方法)

# 描述一下Promise

Promise是JS异步编程解决方案之一,它的链式调用出现提高了代码的可阅读性和可维护性。在它之前我们只能通过[回调函数]和[事件]解决异步回调的问题,并且容易出现臭名昭著的[回调地狱]

# Promise.all中如果有一个抛出异常了会如何处理

会直接抛出错误。

# Promise.all的实现代码:

static all(promiseArr) {
    let index = 0,
        res = []
    return new Promise((resolve, reject) => {
        for (let i = 0; i < promiseArr.length; i++) {
            Promise.resolve(promiseArr[i]).then(
                value => {
                    res[i] = value
                    index++
                    if (index === promiseArr.length) {
                        resolve(res)
                    }
                },
                reason => reject(reason)
            )
        }
    })
}

# Promise为什么能链式调用

因为Promise.then会返回一个新的Promise实例

webapp
公众号
开发者导航
切换夜间模式
折叠侧边栏
收起全部