引用类型部分考题总结和分析(含深度比较)

题目

  • 手写深度比较,模拟lodash isEqual
const obj1 = {
    a: 100,
    b: {
        x: [1, 2, 3, NaN],
        y: 100
    }
}
const obj2 = {
    a: 100,
    b: {
        x: [1, 2, 3, NaN],
        y: 100
    }
}

function isObject(obj) {
    return typeof obj === 'object' && obj !== null
}

function isNaN(number) {
    return Number.isNaN(number)
}

Object.prototype.isEqual = function isEqual(obj1, obj2) {
    // 其中某个是值类型
    if (!isObject(obj1) || !isObject(obj2)) {
        // 两个都是NaN的情况
        if (isNaN(obj1) && isNaN(obj2)) {
            return true
        }
        return obj1 === obj2
    }
    // 传的是同一个对象
    if (obj1 === obj2) {
        return true
    }
    const obj1KeyCount = Object.keys(obj1)
    const obj2KeyCount = Object.keys(obj2)

    // 判断个数是否是相同的
    if (obj1KeyCount.length !== obj2KeyCount.length) {
        return false
    }
    // 以obj1为基准进行递归遍历
    for (const key in obj1) {
        if (obj1.hasOwnProperty(key)) {
            const res = isEqual(obj1[key], obj2[key])
            if (!res) {
                return false
            }
        }
    }
    return true
}


Object.isEqual(obj1, obj2)
  • split和join的区别
    split通过某个分隔符将字符串拆分为数组;
    join通过某个分隔符将数组组合成字符串
  • 数组的push、pop、unshift、shift分别做了什么
    pop:将数组最后一个元素弹出并返回
    push:推送一个元素到数组并返回数组的长度
    unshift:推送一个元素到数组头部并返回数组的长度
    shift:将数组第一个元素弹出并返回
    以上都会对原数组造成影响
  • 以下输出什么:
// 第一题
var a = {"x": 1};
var b = a;
a.x = 2;
console.log(b.x);  // 2


a = {"x": 3};
console.log(b.x);  // 2
a.x = 4;
console.log(b.x);  // 2

// 第二题
var a = {x: 1}
var b = {y: 2}
var c = {y: 3}
a[b] = b
a[c] = c
console.log(a[b], a[c])
  • 数组slice和splice的区别
    slice截取区间[start, end)之间的元素并返回(无副作用),默认end为数组长度、start为0
    splice截取区间[start, start + deleteCount - 1]之间的元素并返回(有副作用),第三个参数为插入的元素
  • [10, 20, 30].map(parseInt)返回结果是什么
    返回结果是[10, NaN, NaN]
知识点
  • 纯函数
    有对应类型的输入和对应类型的输出,并且不改变原数组。数组中的纯函数API有:concatmapfilterArray.from()slice
function pureFunc(input) {
    return input.concat([2, 3, 4])
}

const arr = pureFunc([0, 1])
  • map和parseInt
    map参数为item和index,返回值为数组
    parseInt参数为item和当前的基数,返回值为NaN或number
    parseInt基数为0时是十进制,没有1进制
// 拆解前
[10, 20, 30].map(parseInt)

// 拆解后
[10, 20, 30].map((item, index) => {
    return parseInt(item, index)
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值