1. 数组扁平化
//方法1 递归
var arr = [1,2,[3,4,[5,6,[6],8],9],[10,11,[12],13],14, 15]
function flatten(arr, result){
if(!result){
result = []
}
for(var i=0; i < arr.length; i++){
if(Array.isArray(arr[i])){
flatten(arr[i], result)
}else{
result.push(arr[i])
}
}
return result
}
console.log(flatten(arr))
2.数据去重
function unique(arr){
var map = {}, result = []
for(var i=0;i < arr.length; i++){
var item = arr[i]
if(map[item]===undefined){
result.push(item)
map[item] = true
}
}
return result
}
var arr = [2,3,23,2,4,3,2,4,5,6,7,8,2,2,3,4,5,6,7,1]
console.log(unique(arr))
3.对象的深拷贝
function deepClone1(source){
return JSON.parse(JSON.stringify(source))
}
//递归
function deepClone(target){
if(!target || typeof target!=='object'){
return target
}
var result = Array.isArray(target) ? [] : {};
for(var key in target){
result[key] = deepClone(target[key])
}
return result
}
var mike ={name:'mike'}
var jack={name:'jack'}
var frank = {
name: 'frank',
age: 25,
friends: [mike, jack],
likes: [1,2,3,4,5]
}
var copy = deepClone(frank)
console.log(frank.friends[0] === mike)//true
console.log(copy.friends[0] === copy.friends[0])//true
console.log(frank.friends[0] === copy.friends[0])//false
4.函数的节流和防抖
参考我写的另一篇
5.实现(5).add(3).minus(2)
function checkNum(n){
//n = Number(n)
//return isNaN(n) ? 0 : n;
return (n = Number(n)) && isNaN(n) ? 0 : n
}
Number.prototype.add = function(n){
n = checkNum(n)
return this + n
}
Number.prototype.minus = function(n){
n = checkNum(n)
return this - n
}
consoe.log((5).add(3).minus(2))
6.实现一个each, callback中return false可以打断each
function each(arr, callback){
for(var i=0; i<arr.length; i++){
var flag = callback.call(arr, arr[i], i);
if(flag === false){
break
}
}
}
each([2,3,4,1], function(item, index){
console.log(item, index)
if(index ===2){
return false
}
})
7. 把一个字符串的大小写取反 例如 'Abc' => 'aBC'
//方法1,遍历每一个
function invertStr(str){
var upperCaseReg = /^[A-Z]$/
var charReg = /^[a-zA-Z]$/
return str.split('').map((item)=>{
if(charReg.test(item)){
if(upperCaseReg.test(item)){
return item.toLowerCase();
}else{
return item.toUpperCase();
}
}else{
return item
}
}).join('')
}
var str = 'A地方bc23'
console.log(invertStr(str))
//方法二
str = str.replace(/[a-zA-Z]/g, content => {
console.log(content)
if(/[A-Z]/.test(content)){
return content.toLowerCase();
}else{
return content.toUpperCase();
}
})
console.log(str)
8. 实现一个字符串匹配算法,从字符串S中,查找字符串T,存在返回所在位置,不存在返回-1(也就是自己实现indexOf方法)
//方法1,循环
function myIndexOf(s, t){
var lenT = t.length;
for(var i=0; i <= s.length - lenT; i++){
if(s.substr(i, lenT) === t){
return i
}
}
return -1
}
var s = 'lksjdfherelkjsdf'
var t = 'here'
console.log(myIndexOf(s,t))
//方法2,正则
function myIndexOf2(s, t){
var reg = new RegExp(t)
var res = reg.exec(s)
return res === null ? -1 : res.index
}
var s = 'lksjdfherelkjsdf'
var t = 'here'
console.log(myIndexOf2(s,t))
JS面试题(概念篇)
未完待续
喜欢的朋友点个赞吧
网友评论