Js代码题
function Bar() { return; { a: 1; } } const f = Bar(); console.log(f.a);
输出 error,因为return
后没有值,即使格式化也没有用,因此下方的Object
和return
没有关联
js 将多层嵌套的数组转换为一层数组
let list = [1, [2, [3, [4]], 5]]; Array.prototype.transfer = function (level) { let list = this; const flat = (list) => { return list.reduce((prev, next) => { next = Array.isArray(next) ? next : [next]; return [...prev, ...next]; }, []); }; while (level > 0) { list = flat(list); level--; } return list; };
let list = this
调用时候的数组,在原型链上的东西,使用时即调用本身。
手写防抖节流
//防抖 let btn = document.querySelcetor('button'); let timer = null; btn.onclick = function () { clearTimeout(timer); timer = setTimeout(() => { console.log('触发请求'); }, 1000); }; //节流 let btn = document.querySelcetor('button'); let flag = true; btn.onclick = function () { if (flag) { flag = false; console.log('触发请求'); setTimeout(() => { flag = true; }, 1000); } };
一道经典面试题—setTimeout(function(){},0)
for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 0); console.log(i); } //结果为0 1 2 3 3 3
该题考了三个知识点:作用域,闭包,异步
先简化此题
setTimeout(function () { console.log(1); }, 0); console.log(2); //先打印2,再打印1
因为使用 var,是 es5 里面的内容,所以没有块级作用域
for (var i = 0; i < 3; i++) {} console.log(i); //输出3
怎么保证能弹出 0,1,2
for (var i = 0; i < 3; i++) { setTimeout( (function (i) { return function () { console.log(i); }; })(i), 0 ); //改为立即执行的函数 console.log(i); } //输出为0,1,2,0,1,2
实现一个简单的数组去重
let arr =[1,2,3,2,4,2,1,3] arr.reduce((accumulator, currentValue) => { if (!accumulator.includes(currentValue)) { return [ ...accumulator, currentValue ] } return accumulator }, [])
对范围内的所有数字求和
我们将传递给您一个包含两个数字的数组。返回这两个数字的总和加上它们之间所有数字的总和。最低的数字并不总是最先出现的。
例如,sumAll([4,1])应该返回,10因为 1 到 4(包括 1 和 4)之间的所有数字的总和是10。
function sumAll(arr) { let sumBetween = 0; for (let i = Math.min(...arr); i <= Math.max(...arr); i++) { sumBetween += i; } return sumBetween; } sumAll([1, 4]);
function sumAll(arr) { const [first, last] = [...arr].sort((a, b) => a - b); return first !== last ? first + sumAll([first + 1, last]) : first; } sumAll([1, 4]);
function sumAll(arr) { let max = Math.max(arr[0], arr[1]); let min = Math.min(arr[0], arr[1]); let sumBetween = 0; for (let i = min; i <= max; i++) { sumBetween += i; } return sumBetween; } sumAll([1, 4]);
找出字符串中最长的单词
// 解法一 // 使用reduce进行遍历,将单词长度存到longest里面,最后返回longest function findLongestWordLength(str) { let arr = str.split(' ') return arr.reduce((longest, word) => { return Math.max(longest, word.length) }, 0) } // 解法二 // 使用map进行遍历 function findLongestWordLength(str) { return Math.max(...str.split(' ').map(word=>word.length)) } findLongestWordLength("The quick brown fox jumped over the lazy dog");
求每个数组中最大的值并将这些值重新放入一个新数组中
//解法一 function largestOfFour(arr) { return arr.map((group) => { return group.reduce((prev, current) => { return current > prev ? current : prev; }); }); } //解法2 function largestOfFour(arr) { return arr.reduce((newArr, arr) => { let max = Math.max(...arr) return [...newArr, max]; }, []); } largestOfFour([[4, 5, 1, 3],[13, 27, 18, 26],[32, 35, 37, 39],[1000, 1001, 857, 1]])
返回提供的字符串,每个单词的第一个字母大写。确保单词的其余部分是小写的。
// 解法一:我们正在使整个字符串小写,然后将其转换为数组。然后我们使用 map 函数将小写字符替换为大写。最后,我们使用join方法返回字符串。 function titleCase(str) { var convertToArray = str.toLowerCase().split(" "); var result = convertToArray.map(function(val) { return val.replace(val.charAt(0), val.charAt(0).toUpperCase()); }); return result.join(" "); } titleCase("I'm a little tea pot"); // 解法二:使用正则表达式 function titleCase(str) { return str.toLowerCase().replace(/(^|\s)\S/g, L => L.toUpperCase()); } titleCase("I'm a little tea pot")
确认字符串的结尾
检查字符串(第一个参数,str
)是否以给定的目标字符串(第二个参数,target
)结尾。
// 解法一 function confirmEnding(str, target) { return str.slice(-target.length) === target ? true : false } // 解法二 function confirmEnding(str, target) { // "Never give up and good luck will find you." // -- Falcor let re = new RegExp(target + "$", "i"); return re.test(str); } confirmEnding("Bastian", "n");
解法一:str.slice(-target.length)
切割str
中target.length的长度,加负号标识从结尾开始,判断是否等于target,等于则返回true否则返回false。
解法二:使用正则表达式,new RegExp(target + "$", "i")
指判断是否是target字符串结尾,且忽略大小写。
Return true
if the string in the first element of the array contains all of the letters of the string in the second element of the array.
function mutation(arr) { return arr[1].toLowerCase().split('').every(letter => { return arr[0].toLowerCase().indexOf(letter) != -1; }) } mutation(["hello", "hey"]);
区分两个数组
比较两个数组并返回一个新数组,其中包含仅在两个给定数组之一中找到的任何项目,但不能同时在这两个数组中找到。换句话说,返回两个数组的对称差。
// 方法一 function diffArray(arr1, arr2) { let newArr = [...arr1, ...arr2] return newArr.filter(item => !arr1.includes(item) || !arr2.includes(item)) } // 方法二 function diffArray(arr1, arr2) { return [...diff(arr1, arr2), ...diff(arr2, arr1)]; function diff(a, b) { return a.filter(item => b.indexOf(item) === -1); } } diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);