1.21面试题
作者:互联网
- 什么是原型,什么是原型链
-
每一个构造函数都有一个原型对象属性prototype,每一个JavaScript对象在创建的时候就会关联这个对象,这个对象就是原型,包含了很多属性
实例化的对象中的__proto__会指向这个原型对象属性prototype -
原型链就是多个对象通过 proto 的方式连接了起来,相互关联的原型组成的链状结构就是原型链
- 剔除数组首元素的方法有哪些
-
arr.shift()
这种方法会改变原数组 -
使用
arr.slice
浅拷贝数组 这种方法不会改变原数组
arr.slice(1,arr.length)
- splice()的删除 这种方法会改变原数组
arr.splice(0,1)
- 使用filter判断下标 不会改变原数组
newArr = arr.filter((val, index, arr) => {
return index !== 0;
})
- promise的状态有哪些
- pending 未决
- reslove 成功
- reject 失败
- promise有什么特点
- Promise对象的状态不受外界影响 三种状态 pending reslove reject
- Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成 reslove或者由pending变成rejected
-
什么是回调地狱
简单地说就是一个异步请求套着一个异步请求,一个异步请求依赖于另一个的执行结果,使用回调的方式相互嵌套
到最后,缩略图成了 一个三角形 造成了可阅读性差,可阅读性差就代表代码的可维护性
和可迭代性差
,最后还有一个就是可扩展性差
。
也不符合设计模式的六大原则, 其中的单一职责原则
, 和开闭原则
-
for in 遍历数组有哪些问题
- 遍历顺序是任意的,不适用于数组遍历
- 观看示例,输出结果是什么,并阐明理由
例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不会进行变量提升
标签:面试题,console,log,arr,原型,let,promise,1.21 来源: https://www.cnblogs.com/dark-duck/p/14324933.html