_isPrototype.js 文件解读
判断是否是一个原型,而不是一个对象
原型有构造器,并且构造器是个fn,最后构造器指向自己。
a.prototype
a.prototype.contructor === a.prototype
function isPrototype(value) {
var Ctor = value && value.constructor, // 获取原型对象的构造器,这是一个fn类型
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
// proto是构造器的原型,其指向原型对象本身
return value === proto;
}
// 构造器是原型的一个引用。
_freeGlobal.js
node.js全局global对象判断
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
_root.js
var freeGlobal = require('./_freeGlobal'); // 引入node环境global
var freeSelf = typeof self == 'object' && self && self.Object === Object && self; // window环境self
// 如果没有global或者self,则调用一个匿名函数返回this。间接获取顶级this指向。
var root = freeGlobal || freeSelf || Function('return this')();
_promise.js
从root里面获取promise参数。
调用getNative()->getValue()->baseIsNative()
function getNative(object, key) {
var value = getValue(object, key); // 是否有值
return baseIsNative(value) ? value : undefined; // 是否是自然的值
}
_getValue.js
function getValue(object, key) {
return object == null ? undefined : object[key];
}
_baseIsNative
function baseIsNative(value) {
if (!isObject(value) || isMasked(value)) {
return false;
}
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
// Used to match `RegExp`
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
_isFunction.js
function isFunction(value) {
if (!isObject(value)) {
return false;
}
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 9 which returns 'object' for typed arrays and other constructors.
var tag = baseGetTag(value);
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
var asyncTag = '[object AsyncFunction]',
funcTag = '[object Function]',
genTag = '[object GeneratorFunction]',
proxyTag = '[object Proxy]';
_baseGetTag.js 读取对象的字符串描述
function baseGetTag(value) {
if (value == null) { // 是null或者undefine 对象
return value === undefined ? undefinedTag : nullTag;
}
// Symbol 对象
// Object(Symbol(x))的[[primitiveValue]](原始值)指向Symbol,运行时会被转化为symbol对象。可以输入Object(11), Object('11')查看其原始值。
// Object(Symbol(x)).__proto__ 指向Symbol,可以浏览器查看一下。
// 查找有没有Symbol.toStringTag 这样的属性,有的话则为symbol类型。Symbol.toStringTag 为symbol所专有的属性,可以Symbol.prototype 在原型中查找到该属性名,其值为“Symbol”。
return (symToStringTag && symToStringTag in Object(value))
? getRawTag(value)
: objectToString(value);
}
var nullTag = '[object Null]',
undefinedTag = '[object Undefined]';
var symToStringTag = Symbol ? Symbol.toStringTag : undefined; // Symbol(Symbol.toStringTag)
// 如果是symbol对象,则循环它的值,否则为undefined
_objectToString.js 常用操作,调用原型对象的toString将对象的类型字符串打印出来。打印结果如[‘object object’]
function objectToString(value) { return nativeObjectToString.call(value);}var objectProto = Object.prototype;var nativeObjectToString = objectProto.toString;// 一般写为 Object.prototype.toString.call(object)
_getRawTag.js 忽略symbol.toStringTag类型的获取对象描述字符串的函数
var objectProto = Object.prototype;var hasOwnProperty = objectProto.hasOwnProperty;var nativeObjectToString = objectProto.toString;var symToStringTag = Symbol ? Symbol.toStringTag : undefined;function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), // 自身属性是否包含symbol属性 tag = value[symToStringTag]; // 复制一份 symToStringTag 值 try { value[symToStringTag] = undefined; // 尝试重置 var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); // 返回对象字符串描述。如:[object Symbol] if (unmasked) { if (isOwn) { // 如果是本身拥有的,则还原。 value[symToStringTag] = tag; } else { delete value[symToStringTag]; // 删除该值 } } return result;}
_Symbol.js
// symbol 不能转换为字符串,也不能转换为数字类型,否则报错。function toKey(value) { if (typeof value == 'string' || isSymbol(value)) { return value; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;}var INFINITY = 1 / 0;
isSymbol.js
var symbolTag = '[object Symbol]';function isSymbol(value) { return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag);}// 直接判断类型为symbol,或者是一个对象,并且里面的值是symbol类型。// let a = Symbol(111)// typeof a == 'symbol'
_isObjectLike.js 是否是类对象,判断对象是否是对象即可, undefined属于对象和数组类型,不是类对象。
function isObjectLike(value) { return value != null && typeof value == 'object';}
版权声明:本文为junjiahuang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。