是什么
通常面試的時候,面試官會提一些JS手寫的面試題晌梨,主要是為了考察面試者JS 基礎(chǔ)的掌握程度须妻。
以下是整理收集的手寫面試題,方便大家學(xué)習(xí)與鞏固 JS 基礎(chǔ)知識
實現(xiàn)類數(shù)組轉(zhuǎn)化為數(shù)組
const arrayLike=document.querySelectorAll('div')
// 1.擴(kuò)展運算符
[...arrayLike]
// 2.Array.from
Array.from(arrayLike)
// 3.Array.prototype.slice
Array.prototype.slice.call(arrayLike)
// 4.Array.apply
Array.apply(null, arrayLike)
// 5.Array.prototype.concat
Array.prototype.concat.apply([], arrayLike)
實現(xiàn)模板字符串解析功能
let template = '我是{{name}}掌逛,年齡{{age}}司倚,性別{{sex}}'
let data = {
name: '姓名',
age: 18
}
function render (template, data) {
let computed = template.replace(/\{\{(\w+)\}\}/g, function (match, key) {
return data[key]
})
return computed
}
console.log(render(template, data)) // 我是姓名动知,年齡18,性別undefined
實現(xiàn)列表轉(zhuǎn)成樹形結(jié)構(gòu)
const list = [
{
id: 1,
text: '節(jié)點1',
parentId: 0 //這里用0表示為頂級節(jié)點
},
{
id: 2,
text: '節(jié)點1_1',
parentId: 1 //通過這個字段來確定子父級
}
]
function listToTree (data) {
let temp = {}
let treeData = []
for (let index = 0; index < data.length; index++) {
const element = data[index]
temp[data[index]['id']] = element
}
for (let i in temp) {
if (+temp[i].parentId != 0) {
if (!temp[temp[i].parentId].children) {
temp[temp[i].parentId].children = []
}
temp[temp[i].parentId].children.push(temp[i])
} else {
treeData.push(temp[i])
}
}
return treeData
}
console.log(listToTree(list))
實現(xiàn)樹形結(jié)構(gòu)轉(zhuǎn)成列表
const list = [
{
id: 1,
text: '節(jié)點1',
parentId: 0,
children: [
{
id: 2,
text: '節(jié)點1_1',
parentId: 1
}
]
}
]
function treeToList (data) {
let res = []
const dfs = tree => {
tree.forEach(item => {
if (item.children) {
dfs(item.children)
delete item.children
}
res.push(item)
})
}
dfs(data)
return res
}
console.log(treeToList(list))
冒泡排序--時間復(fù)雜度 n^2
function bubbleSort(arr) {
// 緩存數(shù)組長度
const len = arr.length;
// 外層循環(huán)用于控制從頭到尾的比較+交換到底有多少輪
for (let i = 0; i < len; i++) {
// 內(nèi)層循環(huán)用于完成每一輪遍歷過程中的重復(fù)比較+交換
for (let j = 0; j < len - 1; j++) {
// 若相鄰元素前面的數(shù)比后面的大
if (arr[j] > arr[j + 1]) {
// 交換兩者
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
// 返回數(shù)組
return arr;
}
// console.log(bubbleSort([3, 6, 2, 4, 1]));
選擇排序--時間復(fù)雜度 n^2
function selectSort(arr) {
// 緩存數(shù)組長度
const len = arr.length;
// 定義 minIndex,緩存當(dāng)前區(qū)間最小值的索引丹皱,注意是索引
let minIndex;
// i 是當(dāng)前排序區(qū)間的起點
for (let i = 0; i < len - 1; i++) {
// 初始化 minIndex 為當(dāng)前區(qū)間第一個元素
minIndex = i;
// i摊崭、j分別定義當(dāng)前區(qū)間的上下界,i是左邊界呢簸,j是右邊界
for (let j = i; j < len; j++) {
// 若 j 處的數(shù)據(jù)項比當(dāng)前最小值還要小,則更新最小值索引為 j
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 如果 minIndex 對應(yīng)元素不是目前的頭部元素根时,則交換兩者
if (minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
}
return arr;
}
// console.log(quickSort([3, 6, 2, 4, 1]));
插入排序--時間復(fù)雜度 n^2
function insertSort(arr) {
for (let i = 1; i < arr.length; i++) {
let j = i;
let target = arr[j];
while (j > 0 && arr[j - 1] > target) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = target;
}
return arr;
}
// console.log(insertSort([3, 6, 2, 4, 1]));
快排--時間復(fù)雜度 nlogn~ n^2 之間
function quickSort(arr) {
if (arr.length < 2) {
return arr;
}
const cur = arr[arr.length - 1];
const left = arr.filter((v, i) => v <= cur && i !== arr.length - 1);
const right = arr.filter((v) => v > cur);
return [...quickSort(left), cur, ...quickSort(right)];
}
// console.log(quickSort([3, 6, 2, 4, 1]));
歸并排序--時間復(fù)雜度 nlog(n)
function merge(left, right) {
let res = [];
let i = 0;
let j = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
res.push(left[i]);
i++;
} else {
res.push(right[j]);
j++;
}
}
if (i < left.length) {
res.push(...left.slice(i));
} else {
res.push(...right.slice(j));
}
return res;
}
function mergeSort(arr) {
if (arr.length < 2) {
return arr;
}
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
// console.log(mergeSort([3, 6, 2, 4, 1]));
二分查找--時間復(fù)雜度 log2(n)
function search(arr, target, start, end) {
let targetIndex = -1;
let mid = Math.floor((start + end) / 2);
if (arr[mid] === target) {
targetIndex = mid;
return targetIndex;
}
if (start >= end) {
return targetIndex;
}
if (arr[mid] < target) {
return search(arr, target, mid + 1, end);
} else {
return search(arr, target, start, mid - 1);
}
}
// const dataArr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// const position = search(dataArr, 6, 0, dataArr.length - 1);
// if (position !== -1) {
// console.log(`目標(biāo)元素在數(shù)組中的位置:${position}`);
// } else {
// console.log("目標(biāo)元素不在數(shù)組中");
// }