前排提醒
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);
}
网友评论