美文网首页
2022-04-04 lodash源码学习 - 基础判断(一)

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

作者: 网恋被骗二块二 | 来源:发表于2022-04-05 23:06 被阅读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);
          }
    

    相关文章

      网友评论

          本文标题:2022-04-04 lodash源码学习 - 基础判断(一)

          本文链接:https://www.haomeiwen.com/subject/qcucsrtx.html