面试题收集:
6月12日面霸说-严羽PPT资料(1)(1)(1).pdf
HR面试问题汇总.pdf
前端面试题 V2.0.pdf
字节进阶面试题.pdf
人保SQL编写知识分享_201902B(1).pdf
前端面试宝典.pdf
HTTP/2基础教程.pdf
小米技术月刊-十月刊.pdf
httrack教程.docx
微前端的实现原理.pdf
你不知道的JavaScript(上卷).pdf
你不知道的JavaScript(下卷).pdf
JavaScript高级程序设计(第4版).pdf
京东面试.md
1. 数组判断
知识点分析:
- 类型判断
/*问题:JavaScript中数组的判断*/function isArray(arr){//请实现函数主体return false;}// testisArray([]); // trueisArray({}); // false
答案:
// 方法1Array.isArray(arr) //es6+// 方法2function isArray(arr){const typeStr = Object.prototype.toString.call(arr)return typeStr.includes('Array')}// 方法3function isArray(arr){//请实现函数主体return arr instanceof Array}// 方法4const arr = [1, 2, 3, 4]arr.constructor === Array // truearr.__proto__.constructor === Array //true
总结:
/*问题:JavaScript 数组的增删插*/var arr = [];// 给arr连续插入 1,2,3,4,5, 结果= [1,2,3,4,5]// 删除第2个元素,结果 = [1,2,4,5]// 获取数组最后2个元素 = [4,5]
答案:
// 给arr连续插入 1,2,3,4,5, 结果= [1,2,3,4,5]arr.push(1,2,3,4,5)// 删除第3个元素,结果 = [1,2,4,5]delete arr[2]arr.splice(2,1)// 获取数组最后2个元素 = [4,5]arr.slice(-2)
3. 排序算法
知识点分析:
- 简单排序算法,考察逻辑能力(边界问题)
算法复杂度分析:
| 算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|---|
| 冒泡 | O(n^2) | o(n) | o(n^2) | o(1) | 稳定 |
冒泡
/*问题:用JavaScript写个冒泡算法实现*/function sort(arr){// 请实现函数主题return arr;}fasort([1,2,6,4,8,7])// 结果 = [1,2,4,6,7,8]
答案:
function sort(arr) {// 外循环只是遍历,不参与逻辑// 每次循环,将最大值放在最后面// 边界条件每次靠前一位for (let i = 0; i < arr.length - 1; i++) {for (let j = 0; j < arr.length - 1 - i; j++) {let temp = ''if (arr[j] > arr[j + 1]) {temp = arr[j]arr[j] = arr[j + 1]arr[j + 1] = temp}}}return arr}sort([8, 6, 6, 4, 1, 7])// 结果 = [1, 4, 6, 6, 7, 8]
4. 随机字符串(指定长度)
知识点分析:
- random()的使用:大于等于0.0、小于1.0的double型随机数。
- charAt()使用:获取一个指定下标的字符串
/*问题:一、用原生 javascript 生成一个指定长度的随机字符串*/function randomStr(length) {// 请实现函数主体return "";}randomStr(10);
答案:
function randomStr(length = 32) {// 字符集const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'let i = 0, str = ''while (i <= length) {i++str += chars.charAt(Math.floor(Math.random() * (chars.length + 1)))}// 请实现函数主体return str}randomStr(10);
5. 顺序打印一个列表,两次打印间需要有时间间隔
知识点分析:
- 事件循环知识:同步代码和异步代码的执行顺序问题。
- 定时器使用时常见问题。
// 顺序打印一个列表,两次打印间需要有时间间隔// 入参格式参考:list = [1, 2, 3, 4] delay = 5// 控制台输出情况:// > 1// (过了 5 秒)// > 2// (过了 5 秒)// > 3// (过了 5 秒)// > 4function printList(list, delay) {/*** 此处写代码逻辑*/}printList([1, 2, 3, 4, 5], 5);
答案:
// 方法1 间隔定时器function printList(list, delay) {let i = 0, timer = ''console.log(list[i])timer = setInterval(() => {// 异步自增i++if (i < list.length ) {console.log(list[i])} else {console.log('zheli')clearInterval(timer)}}, delay * 1000);}printList([1, 2, 3, 4, 5], 5);// 方法2:延时定时器function printList(list, delay) {console.log(list[0])for (let i = 1; i < list.length; i++) {setTimeout(() => {console.log(list[i])}, delay * 1000 *i);}}printList([1, 2, 3, 4, 5], 5);
6. URL参数解析为一个对象
知识点分析:
- 考察字符串方法掌握的熟练度
/*问题:请编写一个JavaScript函数 parseQueryString,它的用途是把URL参数解析为一个对象*/var url = "https://pd.alipay.com/#/product/productHome?catalogCode=GC&tabKey=GOC&roleType=GOC"function parseQueryString(url) {// your code here}var paramObj = parseQueryString(url);console.log(paramObj.catalogCode, paramObj.tabKey, paramObj.roleType); // GC GOC GOC
答案:
var url = "https://pd.alipay.com/#/product/productHome?catalogCode=GC&tabKey=GOC&roleType=GOC"function parseQueryString(url) {// your code hereconst urlList = url.split('?')const paramsList = urlList[1].split('&')const obj = {}paramsList.map(item => {const itemList = item.split('=')obj[itemList[0]] = itemList[1]})return obj}var paramObj = parseQueryString(url);console.log(paramObj.catalogCode, paramObj.tabKey, paramObj.roleType); // GC GOC GOC
7. 其他题型
知识点分析:
- 考察常用标准dom属性、方法掌握的熟练度
/*问题:请编写一段JavaScript脚本生成下面这段DOM结构。要求:使用标准的DOM方法或属性。<div id=”example”><p class=”slogan”>淘!你喜欢</p></div>*/function buildDom() {// 请实现函数主体document.innerHtml}buildDom();/*问题:用正则表达式从字符串 123ABC456ABC 中取出数字串*/function reg(str) {// 请实现函数主体}reg("123ABC456ABC")// [123,456]// 问题:实现一个日程安排函数,可以不断地登记行程安排,但不允许时间上出现三重重叠// *三重重叠的含义为:有某个日期,同时被三次登记覆盖到// *不考虑不同月份,并且假定每个月都是 31 天// const mySchedule = new Calendar();// mySchedule.book(1, 10) true// mySchedule.book(8, 14) true (8-10 双重重叠)// mySchedule.book(22, 30) true// mySchedule.book(2, 9) false (8-9 三重重叠)// mySchedule.book(18,20) true// {// day: 1,// bookNum: 0,// }// [[1, 10], [8, 14], [22, 30], [2, 9], [18, 20]]class Calendar {/*** 此处写代码逻辑*/}// 问题:从一个树状数据结构中,找出值最大的一个节点// 入参格式参考:const sourceTree = {id: "i1",value: 17,left: {id: "i3",value: 83,left: {id: "i4",value: 101},right: {id: "i9",value: 22}},right: {id: "i11",value: 26}};// 出参格式参考:const maxNode = {id: "i4",value: 101};function findMaxNode(tree) {/*** 此处写代码逻辑*/}findMaxNode(sourceTree) // ==maxNode
