手写深度比较,模拟lodash中的isEqual
// 判断是否是object
function isObject(obj){
return typeof obj === 'object' && obj !== null
}
// 全相等
function isEqual(obj1,obj2){
if(!isObject(obj1)||!isObject(obj2)){
return obj1 === obj2
}
if(obj1 === obj2){
return true
}
// 两个都是引用类型,深度比较全相等
// 1.比较keys的个数是否相同
const obj1Keys = Object.keys(obj1)
const obj2Keys = Object.keys(obj2)
if(obj1Keys.length!==obj2Keys.length){
return false
}
// 2.以obj1为基准。和obj2以此递归比较
for (const key in obj1) {
const res = isEqual(obj1[key],obj2[key])
if(!res){
return false
}
}
// 3.全相等
return true
}
// 测试
const obj1 = {
a:100,
b:{
x:100,
y:200
}
}
const obj2 = {
a:100,
b:{
x:100,
y:200
}
}
console.log(isEqual(obj1,obj2));
split和join
数组的pop push unshift shift分别做什么
pop
push
添加至源数组最后一位
返回添加后的数组length
unshift
shift
纯函数
不改变源数组
返回一个新数组
concat
map
filter
slice
arrayObject.slice(start,end),返回选定的新数组,源数组不变
非纯函数
push pop shift unshift
forEach
some every
reduce
数组slice和splice的区别
slice
纯函数
arr.slice() 可以用作深拷贝
arr2 = arr.slice(1,4) 截取1-4位
arr2 = arr.slice(2) 截取2到最后
arr2 = arr.slice(-2) 倒数2位截到最后
splice
let arr = [10,20,30,40]
let arr2 = arr.splice(2,1,'a','b','c')
// arr [10, 20, "a", "b", "c", 40]
// arr2 [30]
// 第2位开始截取1位,把后面的替换进去
// 返回截取的数组
//一道面试题
[10,20,30].map(parseInt)
//[10,NaN,NaN]
// 拆解
[10,20,30].map((num,index)=>{
//parseInt的第二位的进制
return parseInt(num,index)
})
函数call和apply的区别
传参方式不同 call(this,p1,p2) apply(this.[p1,p2])
闭包是什么?有什么特性?有什么影响?
阻止事件冒泡和默认行为
event.stopPropagation()
event.preventDefault()
函数声明和函数表达式的区别
函数声明 function fn(){}
函数表达式 const fn = function(){}
函数声明会在代码执行前预加载,函数表达式不会
new Object()和Object.create()区别
{}等同于new Object()
Object.create(null)没有原型
Object.create({...})可指定原型 {...}会放在一个空对象的原型中
正则表达式
邮政编码 /\d{6}/
小写英文字母 /^[a-z]+$/
日期格式 /^\d{4}-\d{1,2}-\d{1,2}$/
用户名 /^[a-zA-Z]\w{5,17}$/
多维数组转一维
function flat(arr){
//验证是否还有深层数组
const isDeep = arr.some(item=>item instanceof Array)
if(!isDeep){
return arr
}
const res = Array.prototype.concat.apply([],arr)
return flat(res)//递归
}
const res = flat([1,2,[3,4,[5,6]],7])
console.log(res);
数组去重
function unique(arr){
const res = []
arr.forEach(item=>{
if(res.indexOf(item)<0){
res.push(item)
}
})
return res
}
// set去重
function unique(arr){
const set = new Set(arr)
return [...set]
}
最后编辑于 :2021.03.23 15:04:05
©著作权归作者所有,转载或内容合作请联系作者 平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。