2024面试题汇总
- 如可判断对象是不是空对象?
1.1可以使用Object.keys(obj).length===0,判断出来没有属性
1.2 JSON.stringify(obj)===”{}“为true,则代表空属性
1.3 Object.getOwnPropertyNames获取到对象中的属性名,存到一个数组中,返回数组对象.当为空时也代表属性为空。
1.4 for in循环如果循环出来的值为空代表对象没有属性
延申:
// 循环的对象值是属性名 var obj={a:1,b:2,c:3}; for(var prop in obj){ console.log(prop+" "+obj[prop]); } // 循环的数组值是数组下标,并且不推荐循环数组,当数组赋值了Object.prototype也会被遍历出来 var arr = ['nick','freddy','mike','james']; for(var index in arr){ console.log(index +'. ' + arr[index]); } // 0. nick // 1. freddy // 2. mike // 3. james 主要区别:for...of 用来遍历数组,不可以遍历对象;相对于forEach是可以使用break;for..of适用于无需知道索引值的数组遍历,可以中断,可以怼字符串、类数组、map和set类型数组的迭代。
2.手写深拷贝
function deepCopy(obj){ if(typeof obj !== 'object') return let newObj = Arrary.isArrary(obj) ? [] : {} for( let key in obj){ if(obj.hasOwnProerty(key)){ newObj[key] = typeof obj[key] === 'object' ? deeCopy(obj[key]) : obj[key] } }
return newObj }
延申:JSON.stringify()方式不推荐使用,当对象内容为undefined,null,Date,RegExp,function,error时会报错;
hasOwnProperty是检测对象的自用属性,原型上的属性都不会检测,跨层级的属性也不会检测。
let obj={a:b,c:{d:e} obj.prototype = f:obj.hasOwnProperty(a)//true (d)//false (f) // false
3.防抖
// 函数防抖是指在事件被触发 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新计时。这可以使用在一些点击请求的事件上,避免因为用户的多次点击向后端发送多次请求 function debounce (fn, wati) { let timer = null return function(...args) { let _this = this if(timer) clearTimeout(timer) // 重复点击时清空原定时器 timer = setTimeout(function() { fn.apply(_this,args) },wait) } }
4.节流
//函数节流是指规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。节流可以使用在 scroll 函数的事件监听上,通过事件节流来降低事件调用的频率 function throttle(fn,wait){ let timer = undefined let _this = this return function(...args){ if(timer !== undefined){ return // 如果定时器存在,则直接返回。不执行原函数 }else{ fn.apply(_this,args) timer = setTimeout(function(){ //执行完原函数后,重置timer,重置期间不会再触发都会被return timer = undefined },wait) } } }