Loading

1.21面试题

  1. 什么是原型,什么是原型链
  • 每一个构造函数都有一个原型对象属性prototype,每一个JavaScript对象在创建的时候就会关联这个对象,这个对象就是原型,包含了很多属性
    实例化的对象中的__proto__会指向这个原型对象属性prototype

  • 原型链就是多个对象通过 proto 的方式连接了起来,相互关联的原型组成的链状结构就是原型链

  1. 剔除数组首元素的方法有哪些
  • arr.shift() 这种方法会改变原数组

  • 使用arr.slice浅拷贝数组 这种方法不会改变原数组

arr.slice(1,arr.length)
  • splice()的删除 这种方法会改变原数组
arr.splice(0,1)
  • 使用filter判断下标 不会改变原数组
newArr = arr.filter((val, index, arr) => {
    return index !== 0;
})
  1. promise的状态有哪些
  • pending 未决
  • reslove 成功
  • reject 失败
  1. promise有什么特点
  • Promise对象的状态不受外界影响 三种状态 pending reslove reject
  • Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成 reslove或者由pending变成rejected
  1. 什么是回调地狱
    简单地说就是一个异步请求套着一个异步请求,一个异步请求依赖于另一个的执行结果,使用回调的方式相互嵌套
    到最后,缩略图成了 一个三角形 造成了可阅读性差,可阅读性差就代表代码的可维护性可迭代性差,最后还有一个就是可扩展性差
    也不符合设计模式的六大原则, 其中的单一职责原则, 和 开闭原则

  2. for in 遍历数组有哪些问题

  • 遍历顺序是任意的,不适用于数组遍历
  1. 观看示例,输出结果是什么,并阐明理由

例1

const promise = new Promise((resolve, reject) => {
    console.log(1)
    resolve()
    console.log(2)
})
promise.then(() => {
    console.log(3)
})
console.log(4)
// 1 2 4 3
// Promise的创建是一个同步过程,里面的同步代码会先执行
// 第一轮事件循环会先执行所有的同步任务
// promise在下一轮的事件循环中执行

例2

function fn(){
    for (let i = 0; i < 4; i++) {
        setTimeout(function(){
            console.log(i)
        },1000)
    }
}
fn()

// 0 1 2 3
// let有自己的作用域块 { 循环体 } 在每次执行循环体之前,JS 引擎会把 i 在循环体的上下文中重新声明及初始化一次
// 所以在for循环中的表达式中使用let它的每一个值都会单独存在一个独立的作用域中不会被覆盖掉
// 计时器可以在scope作用域链中找到let声明的作用域

例3

let a = 0
let b = async () => {
    a = a + await 10
    console.log('2', a)
}
b()
a++
console.log('1', a)

// 1 1 
// 2 10
// async表示函数体里有异步操作,await会把10包装成一个promise对象,会在下一轮的事件循环中开始,第二个a是10 是因为let不会进行变量提升
posted @ 2021-01-26 20:52  不吃苦瓜^  阅读(59)  评论(0编辑  收藏  举报