lodash源码系列——isObject和isObjectLike

2,777 阅读2分钟

写在前面

本人前端小白,今年六月份刚毕业,一直想花时间研究react的源码,但都发现无从下手,每次看不了多久就放弃了,最后什么也没看懂。无意中在知乎看到一篇文章,不建议直接看已经迭代了这么多大版本的框架源码,建议可以循序渐进的看,从一些简单的工具库的源码入手,既不会打消看源码的积极性,也可以借机夯实自己的基础。恍然大悟,于是打算从lodash下手,萌发了写这个lodash专题系列的想法,一方面是自我激励,一方面也是可以发出来和大家一起学习一下,欢迎大佬们批评指正。

之前也没有接触过lodash,打算从官方文档入手,学习一个api的使用,就自己尝试实现一个api,再与源码进行比较,分析自己的不足。我看的是v4.17.15(最新)的源码,那么让我们从_.isObject开始吧~

第一次写掘金,大家多多包涵~

_.isObject(value)

检查value是否为Object类型。

返回true or false。

自己实现

function isObject(value) {
    const type = typeof value
    if(type === 'function') {
        return true
    }
    if (type === 'object' && value != null) {
        return true
    }
    return false
}

源码

function isObject(value) {
    var type = typeof value
    return value != null && (type == 'object' || type == 'function')
}

分析

源码精炼很多。值得学习和反复推敲。

实现的过程中涉及的相关知识点有:

  1. js的数据类型有哪些?

    boolean、undefined、string、number、null、symbol和object

  2. typeof返回值为object的数据类型有哪些?

    null、array、regexp、date

    typeof null === 'object',但是null为基本数据类型

  3. function也是对象的一种,但是typeof的结果是'function'

  4. null、undefined的相等和严格相等?

undefined == undefined          // true
undefiend === undefined         // true
undefined == null               // true
null == null                    // true
null === null                   // false

_.isObjectLike(value)

检查value是否是类对象。如果一个值是类对象,那么它不应该是null,而且typeof后的结果是"object"。

返回值:true/false。

自己实现

function isObjectLike(value) {
    return value != null && typeof value === 'object'
}

源码

function isObjectLike(value) {
    return value != null && typeof value == 'object'
}

分析

与isObject涉及的知识点差不多,所以基本实现了。