1. sort 的原理
当数组长度小于等于10的时候,采用插入排序;大于10的时候,采用快排
2. 堆、栈、池 的区别
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new出来的对象)或者常量池中(字符串常量对象存放在常量池中)
堆:存放所有new出来的对象
常量池:存在字符串常量和基本类型常量
3. Object.keys() 和 for ... in 的区别
Object.keys() 返回所有可遍历的键名,它的成员只是参数对象自身的(不含继承的)
for ... in 是遍历拿到所有的键名(包括原型链上的),结合hasOwnProperty才能拿到对象自身的
4. 用两个队列实现栈
1)构建队列
2)栈中包含两个队列Q1 和 Q2
3)入栈:若Q1 和 Q2 都为空,则随便一个队列进入队列;若某一个不为空,则不为空的那个队列进入队列;不存在两个都不为空的i情况
4)出栈:将不为空的队列从队首将元素复制到另一个队列中,同时进行出栈操作,直到剩下一个元素位置,再进行最后一次出队列操作
5. 用原生JS实现拖拽
实现拖拽分三个阶段:onmousedown 鼠标按下时,onmousemove 移动,onmouseup 抬起
当鼠标按下时,记录当前xy坐标;移动时计算水平垂直移动距离,设置元素left,top值;鼠标抬起时,取消down事件
6. 如何判断数组还是对象
Array.isArray()
Object.prototype.toString.call()
7. prototype 和 _proto_ 的区别
prototype是一个静态属性,_proto_ 是一个实例属性
每个方法Function都有自己的原型属性prototype,指向它的原型对象Function.prototype
每个对象都有_proto_属性,指向自身构造函数的prototype
8. .call() 是做什么的
可以通过call显式改变this指向,apply,bind 也有类似作用
9. 手写一个call
Function.prototype.myCall = function (obj, ...args) { let fn = this obj = obj || window obj.fn = fn args = args || [] let res = obj.fn(...args) delete obj.fn return res }
10. 看代码,说输出
window.num = 1 var obj = { 'num': 4, 'dbl': (function () { this.num *= 2 return function () { this.num *= 2 } })() } var obj1 = obj.dbl obj1() obj.dbl() console.log(window.num + obj.num) // 12
11. 为什么自执行函数的this指向window
因为函数执行时,实际window调用了它,也就是window.函数名(),那么,里面的this指向当前调用函数的对象,就是window
12. promise 和 async await 有什么区别
两者都是实现异步的方案,Pormise是通过 .then 里卖弄的回调实现,async await 代码会更简介些,像同步代码的写法,可以说是改良版的promise
13. async await 怎么处理异常
可以用try catch