面试题收集:

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. 数组判断

知识点分析:

  1. 类型判断
  1. /*
  2. 问题:JavaScript中数组的判断
  3. */
  4. function isArray(arr){
  5. //请实现函数主体
  6. return false;
  7. }
  8. // test
  9. isArray([]); // true
  10. isArray({}); // false

答案:

  1. // 方法1
  2. Array.isArray(arr) //es6+
  3. // 方法2
  4. function isArray(arr){
  5. const typeStr = Object.prototype.toString.call(arr)
  6. return typeStr.includes('Array')
  7. }
  8. // 方法3
  9. function isArray(arr){
  10. //请实现函数主体
  11. return arr instanceof Array
  12. }
  13. // 方法4
  14. const arr = [1, 2, 3, 4]
  15. arr.constructor === Array // true
  16. arr.__proto__.constructor === Array //true

总结:

  1. 前两种最靠谱;
  2. 后两种有缺陷。如果不是同一个页面或者在iframe跨网页无法判断。

    2. 数组增删插(改)

    知识点分析:

    1. 业务能力(数组方法的熟练度)
  1. /*
  2. 问题:JavaScript 数组的增删插
  3. */
  4. var arr = [];
  5. // 给arr连续插入 1,2,3,4,5, 结果= [1,2,3,4,5]
  6. // 删除第2个元素,结果 = [1,2,4,5]
  7. // 获取数组最后2个元素 = [4,5]

答案:

  1. // 给arr连续插入 1,2,3,4,5, 结果= [1,2,3,4,5]
  2. arr.push(1,2,3,4,5)
  3. // 删除第3个元素,结果 = [1,2,4,5]
  4. delete arr[2]
  5. arr.splice(2,1)
  6. // 获取数组最后2个元素 = [4,5]
  7. arr.slice(-2)

3. 排序算法

知识点分析:

  1. 简单排序算法,考察逻辑能力(边界问题)

算法复杂度分析:

算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性
冒泡 O(n^2) o(n) o(n^2) o(1) 稳定

冒泡

  1. /*
  2. 问题:用JavaScript写个冒泡算法实现
  3. */
  4. function sort(arr){
  5. // 请实现函数主题
  6. return arr;
  7. }fa
  8. sort([1,2,6,4,8,7])// 结果 = [1,2,4,6,7,8]

答案:

  1. function sort(arr) {
  2. // 外循环只是遍历,不参与逻辑
  3. // 每次循环,将最大值放在最后面
  4. // 边界条件每次靠前一位
  5. for (let i = 0; i < arr.length - 1; i++) {
  6. for (let j = 0; j < arr.length - 1 - i; j++) {
  7. let temp = ''
  8. if (arr[j] > arr[j + 1]) {
  9. temp = arr[j]
  10. arr[j] = arr[j + 1]
  11. arr[j + 1] = temp
  12. }
  13. }
  14. }
  15. return arr
  16. }
  17. sort([8, 6, 6, 4, 1, 7])// 结果 = [1, 4, 6, 6, 7, 8]

4. 随机字符串(指定长度)

知识点分析:

  1. random()的使用:大于等于0.0、小于1.0的double型随机数。
  2. charAt()使用:获取一个指定下标的字符串
  1. /*
  2. 问题:一、用原生 javascript 生成一个指定长度的随机字符串
  3. */
  4. function randomStr(length) {
  5. // 请实现函数主体
  6. return "";
  7. }
  8. randomStr(10);

答案:

  1. function randomStr(length = 32) {
  2. // 字符集
  3. const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  4. let i = 0, str = ''
  5. while (i <= length) {
  6. i++
  7. str += chars.charAt(Math.floor(Math.random() * (chars.length + 1)))
  8. }
  9. // 请实现函数主体
  10. return str
  11. }
  12. randomStr(10);

5. 顺序打印一个列表,两次打印间需要有时间间隔

知识点分析:

  1. 事件循环知识:同步代码和异步代码的执行顺序问题。
  2. 定时器使用时常见问题。
  1. // 顺序打印一个列表,两次打印间需要有时间间隔
  2. // 入参格式参考:list = [1, 2, 3, 4] delay = 5
  3. // 控制台输出情况:
  4. // > 1
  5. // (过了 5 秒)
  6. // > 2
  7. // (过了 5 秒)
  8. // > 3
  9. // (过了 5 秒)
  10. // > 4
  11. function printList(list, delay) {
  12. /**
  13. * 此处写代码逻辑
  14. */
  15. }
  16. printList([1, 2, 3, 4, 5], 5);

答案:

  1. // 方法1 间隔定时器
  2. function printList(list, delay) {
  3. let i = 0, timer = ''
  4. console.log(list[i])
  5. timer = setInterval(() => {
  6. // 异步自增
  7. i++
  8. if (i < list.length ) {
  9. console.log(list[i])
  10. } else {
  11. console.log('zheli')
  12. clearInterval(timer)
  13. }
  14. }, delay * 1000);
  15. }
  16. printList([1, 2, 3, 4, 5], 5);
  17. // 方法2:延时定时器
  18. function printList(list, delay) {
  19. console.log(list[0])
  20. for (let i = 1; i < list.length; i++) {
  21. setTimeout(() => {
  22. console.log(list[i])
  23. }, delay * 1000 *i);
  24. }
  25. }
  26. printList([1, 2, 3, 4, 5], 5);

6. URL参数解析为一个对象

知识点分析:

  1. 考察字符串方法掌握的熟练度
  1. /*
  2. 问题:请编写一个JavaScript函数 parseQueryString,它的用途是把URL参数解析为一个对象
  3. */
  4. var url = "https://pd.alipay.com/#
  5. /product/productHome?catalogCode=GC&tabKey=GOC&roleType=GOC"
  6. function parseQueryString(url) {
  7. // your code here
  8. }
  9. var paramObj = parseQueryString(url);
  10. console.log(paramObj.catalogCode, paramObj.tabKey, paramObj.roleType); // GC GOC GOC

答案:

  1. var url = "https://pd.alipay.com/#/product/productHome?
  2. catalogCode=GC&tabKey=GOC&roleType=GOC"
  3. function parseQueryString(url) {
  4. // your code here
  5. const urlList = url.split('?')
  6. const paramsList = urlList[1].split('&')
  7. const obj = {}
  8. paramsList.map(item => {
  9. const itemList = item.split('=')
  10. obj[itemList[0]] = itemList[1]
  11. })
  12. return obj
  13. }
  14. var paramObj = parseQueryString(url);
  15. console.log(paramObj.catalogCode, paramObj.tabKey, paramObj.roleType); // GC GOC GOC

7. 其他题型

知识点分析:

  1. 考察常用标准dom属性、方法掌握的熟练度
  1. /*
  2. 问题:请编写一段JavaScript脚本生成下面这段DOM结构。要求:使用标准的DOM方法或属性。
  3. <div id=”example”>
  4. <p class=”slogan”>淘!你喜欢</p>
  5. </div>
  6. */
  7. function buildDom() {
  8. // 请实现函数主体
  9. document.innerHtml
  10. }
  11. buildDom();
  12. /*
  13. 问题:用正则表达式从字符串 123ABC456ABC 中取出数字串
  14. */
  15. function reg(str) {
  16. // 请实现函数主体
  17. }
  18. reg("123ABC456ABC")// [123,456]
  19. // 问题:实现一个日程安排函数,可以不断地登记行程安排,但不允许时间上出现三重重叠
  20. // *三重重叠的含义为:有某个日期,同时被三次登记覆盖到
  21. // *不考虑不同月份,并且假定每个月都是 31 天
  22. // const mySchedule = new Calendar();
  23. // mySchedule.book(1, 10) true
  24. // mySchedule.book(8, 14) true (8-10 双重重叠)
  25. // mySchedule.book(22, 30) true
  26. // mySchedule.book(2, 9) false (8-9 三重重叠)
  27. // mySchedule.book(18,20) true
  28. // {
  29. // day: 1,
  30. // bookNum: 0,
  31. // }
  32. // [[1, 10], [8, 14], [22, 30], [2, 9], [18, 20]]
  33. class Calendar {
  34. /**
  35. * 此处写代码逻辑
  36. */
  37. }
  38. // 问题:从一个树状数据结构中,找出值最大的一个节点
  39. // 入参格式参考:
  40. const sourceTree = {
  41. id: "i1",
  42. value: 17,
  43. left: {
  44. id: "i3",
  45. value: 83,
  46. left: {
  47. id: "i4",
  48. value: 101
  49. },
  50. right: {
  51. id: "i9",
  52. value: 22
  53. }
  54. },
  55. right: {
  56. id: "i11",
  57. value: 26
  58. }
  59. };
  60. // 出参格式参考:
  61. const maxNode = {
  62. id: "i4",
  63. value: 101
  64. };
  65. function findMaxNode(tree) {
  66. /**
  67. * 此处写代码逻辑
  68. */
  69. }
  70. findMaxNode(sourceTree) // ==maxNode

h1