平時會看到一些,或者其他分享的有趣的面試題。
特在此處整理。你問我爲什麼?
數組相關
分割數組
問題描述
寫一個函數 xxx(n,m) 實現將1~n平均的分爲m組,
如輸入 xxx(5,2)
輸出 [[1,2,3],[4,5]]
輸入 xxx(10,6)
輸出 [[1,2],[3,4],[5,6],[7,8],[9],[10]]
- 思路來源
const chunk = (arr, size) =>
Array.from({length: Math.ceil(arr.length / size)}, (v, i) => arr.slice(i * size, i * size + size));
- 最終結果
const chunk = (m,n)=>{
const arr = Array(m).fill(0).map((v,i)=>i);
const size = m-n;
return Array.from({length:n},(v,i)=>arr.slice(size*i,size*i+size));
}
思路
1. 填充數組arr
2. 根據要分割比例,計算每一份的大小,分割arr。
作用域
題目描述
如下代碼將會輸出什麼結果
var a = 5;
function b(){
if(!a){
var a = 10;
}
console.log(a);
}
b();
本題考查函數作用域和變量提升。
分析
- js有三個作用域 global、塊級作用域let,const(ES6新增)、function。if顯然不是。
- 聲明變量會在解析過程中提升到作用域頂部執行。
由此可得: 在函數體b
開始執行時,由於變量提升。 存在局部變量a
初始值undefinded
;所以最終答案是10
ES6相關
map+parseInt
題目描述
[1,7,11].map(parseInt) 輸出結果爲什麼
要想弄清結果如何,必須先弄清這兩個API的運作機制。
- map接受一個
callback(item,key,array,context)
回調函數。 - parseInt將參數按照約定類型轉換,可接受兩個參數。(str,radix)。radix是一個介於2~36之間的整數(對應進制類型);參數不填,或者爲0默認是10進制
我們帶入循環。
- 1=> parseInt(1,0); // 十進制結果 1
- 7=> parseInt(7,1); // 非法入參結果 NAN
- 10=>parseInt(10,2);// 二進制結果 3
算法相關
編程題,請寫一個函數,完成以下功能
輸入 ‘1, 2, 3, 5, 7, 8, 10’ 輸出 ‘1~3, 5, 7~8, 10’
function transArr(str) {
return str.split(",").map((item, key, arr) => (arr[key + 1] != +item + 1 || key === 0 || arr[key - 1] != item - 1) ? item == +arr[key - 1] + 1 ? `,${item}` : item : ",").toString().replace(/(,)\1+/g, '~')
}
思路
- 標識符合位置 : [1,2,3,8,9,10] >> [1,undefined,’,3’,8,undefinded,’,10’]
- toString 去
undefinded
1,3,8,10 - 利用replace 替換
,,
爲~
完成。