面试题收集:
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;
}
// test
isArray([]); // true
isArray({}); // false
答案:
// 方法1
Array.isArray(arr) //es6+
// 方法2
function isArray(arr){
const typeStr = Object.prototype.toString.call(arr)
return typeStr.includes('Array')
}
// 方法3
function isArray(arr){
//请实现函数主体
return arr instanceof Array
}
// 方法4
const arr = [1, 2, 3, 4]
arr.constructor === Array // true
arr.__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;
}fa
sort([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 秒)
// > 4
function 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 here
const 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