2022-04-04 lodash源码学习 - 基础判断(一)

2022-04-05  本文已影响0人  网恋被骗二块二

前排提醒

a && b 表示 如果 a 为 true 则返回 b,否则返回 a

正文

function isObject(value)
检查 value 是否是 对象

function isObject(value) {
        var type = typeof value; // 保存 value 的 typeof
        return value != null && (type == 'object' || type == 'function');
        // value 不为 null(null 在 typeof 中也算作是对象)并且
        // value 的类型为 对象(object)或
        // value 的类型为 函数(function)
        // 满足返回 true ,表明 value 是一个对象 或 函数
        // 返回 false,表明 value 非对象 或 函数
      }

function isArrayLike(value)
检查 value 是否类似于数组(数组 或 类数组)

/**
*  Checks if `value` is array-like. 
*  A value is considered array-like if it's not a function 
*  and has a `value.length` that's an integer greater than or equal to `0` 
*  and less than or equal to `Number.MAX_SAFE_INTEGER`.
*  如果一个值不是函数并且具有一个大于或等于“0”且小于
*  或等于“Number.MAX_SAFE_INTEGER”的整数,则该值被视为类数组
*/
function isArrayLike(value) {
        return value != null && isLength(value.length) && !isFunction(value);
        // value 不为 null
        // 判断 value 是否有一个满足条件的整数(指 length)
        // 判断 value 满足非函数
        // 返回 true ,表明 value 是一个非函数
      }

function isLength
检查 value 是否是有效的类似数组的长度。

function isLength(value) {
        return typeof value == 'number' &&
          value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
        // 判断 value 的类型是一个 数字
        // 判断 value 不为负数
        // 判断 value 是整数
        // 判读 value 在最大安全整数(max - safe - integer)范围内
      }

function isFunction
检查 value 是否被归类为 Function 对象。

function isFunction(value) {
        // 判断 value 是否是一个非对象?
        if (!isObject(value)) {
          return false;
        }
        var tag = baseGetTag(value);
        // The use of `Object#toString` avoids issues with the `typeof` operator
        // 使用 `Object#toString` 避免了 `typeof` 运算符的问题
        // in Safari 9 which returns 'object' for typed arrays and other constructors.
        // 在 Safari 9 中,它为类型化数组和其他构造函数返回“对象”。
        // 该变量类似于 [object function]
        return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
        // funcTag 对应 [object function] 函数
        // genTag 对应 [object GeneratorFunction] 构造函数
        // asyncTag 对应 [object AsyncFunction] 异步函数
        // proxyTag 对应 [object Proxy] proxy 代理
      }

function baseGetTag
getTag 的基本实现,没有针对错误环境的回退。
这一步属实是有点难受了,首先 symToStringTag 溯源的话 最上层该属性是来自于最外层函数的一个 context 参数从里面提取各种参数等等
总之,这一步就是生成类似于 [object, string] 的值来作比较。

function baseGetTag(value) {
        if (value == null) {
          return value === undefined ? undefinedTag : nullTag;
        }
        // Symbol = context.Symbol
        // 
        return (symToStringTag && symToStringTag in Object(value))
          ? getRawTag(value)
          : objectToString(value);
      }
上一篇 下一篇

猜你喜欢

热点阅读