@haixing_hu/type-detect
v1.2.2
Published
A JavaScript library for detecting common types
Readme
type-detect
type-detect 是一个轻量级的 JavaScript 库,提供用于检测 JavaScript 变量类型的工具。 它设计为兼容最新的 ECMAScript 标准。
如果你想获取变量的更详细的类型信息,可以使用 typeinfo 库,它是基于 type-detect 构建的。
Table of Contents
安装
您可以通过 npm 安装 type-detect:
npm install @haixing_hu/type-detect或者通过 yarn 安装:
yarn add @haixing_hu/type-detect使用
类型检测函数
该库提供了以下用于类型检测的函数:
isArguments(value): boolean:指定值是否为 JavaScript 内建的arguments对象, 即一个类似数组的对象,表示传递给函数的参数。isBigInt(value): boolean:指定值是否为 JavaScript 内建的bigint基本类型。isBoolean(value): boolean:指定值是否为 JavaScript 内建的boolean基本类型或Boolean对象。isBuffer(value): boolean:指定值是否为 JavaScript 内建的ArrayBuffer或SharedArrayBuffer对象。isBuiltInClass(Class): boolean:指定类是否为 JavaScript 内建类。isCollection(value): boolean:指定值是否为 JavaScript 内建的集合对象,即Map或Set对象。 注意,WeakMap和WeakSet对象不被视为普通集合对象,它们可以通过isWeakCollection(value)函数检测。isConsole(value): boolean:指定值是否为 JavaScript 内建的console对象。isCssom(value): boolean:指定值是否为 JavaScript 内建的CSSOM对象。isDataView(value): boolean:指定值是否为 JavaScript 内建的DataView对象。isDom(value): boolean:指定值是否为 JavaScript 内建的 DOM 对象。isError(value): boolean:指定值是否为 JavaScript 内建的Error类或其子类的实例。isEvent(value): boolean:指定值是否为 JavaScript 内建的事件对象,即 JavaScript 内建的Event类或其子类的实例。isFile(value): boolean:指定值是否为 JavaScript 文件 API 对象,即File、Blob、FileList、FileReader或FileReaderSync类的实例。isGlobalObject(value): boolean: 指定值是否为全局对象.isIntl(value): boolean:指定值是否为 JavaScriptIntl命名空间下的内建对象。isIterator(value): boolean:指定值是否为迭代器对象,即具有next()方法的对象。isNumber(value): boolean:指定值是否为 JavaScript 内建的number基本类型或Number对象。isNumeric(value): boolean:指定值是否为 JavaScript 内建的number基本类型、bigint基本类型或Number对象。isString(value): boolean:指定值是否为 JavaScript 内建的string基本类型或String对象。isSymbol(value): boolean:指定值是否为 JavaScript 内建的Symbol基本类型。isTypedArray(value): boolean:指定值是否为 JavaScript 内建的类型化数组对象。isWeak(value): boolean:指定值是否为 JavaScript 内建的弱引用对象,即WeakMap、WeakSet或WeakRef对象。isWeakCollection(value): boolean:指定值是否为 JavaScript 内建的弱引用集合对象,即WeakMap、或WeakSet对象。
以下代码展示了如何使用这些函数:
import { isTypedArray } from '@haixing_hu/type-detect';
function foo(value) {
if (isTypedArray(value)) {
...
} else {
...
}
}特性检测常量
此库提供以下常量用于 JavaScript 引擎的特性检测:
AGGREGATEERROR_EXISTS:JavaScript 内置类AggregateError是否存在。ARRAYBUFFER_EXISTS:JavaScript 内置类ArrayBuffer是否存在。ARRAY_ISARRAY_EXISTS:JavaScript 内置函数Array.isArray()是否存在。ARRAY_ITERATOR_EXISTS:JavaScript 内置函数Array.prototype[Symbol.iterator]是否存在。ASYNC_FUNCTION_EXISTS: JavaScript 内置的异步函数是否存在。ATOMICS_EXISTS:JavaScript 内置对象Atomics是否存在。BIGINT64ARRAY_EXISTS:JavaScript 内置类BigInt64Array是否存在。BIGINT_EXISTS:JavaScript 内置基本类型bigint和内置函数BigInt是否存在。BIGUINT64ARRAY_EXISTS:JavaScript 内置类BigUint64Array是否存在。DATAVIEW_EXISTS:JavaScript 内置类DataView是否存在。FINALIZATIONREGISTRY_EXISTS:JavaScript 内置类FinalizationRegistry是否存在。FLOAT32ARRAY_EXISTS:JavaScript 内置类Float32Array是否存在。FLOAT64ARRAY_EXISTS:JavaScript 内置类Float64Array是否存在。INT16ARRAY_EXISTS:JavaScript 内置类Int16Array是否存在。INT32ARRAY_EXISTS:JavaScript 内置类Int32Array是否存在。INT8ARRAY_EXISTS:JavaScript 内置类Int8Array是否存在。INTERNALERROR_EXISTS:JavaScript 内置类InternalError是否存在。INTL_COLLATOR_EXISTS:JavaScript 内置类Intl.Collator是否存在。INTL_DATETIMEFORMAT_EXISTS:JavaScript 内置类Intl.DateTimeFormat是否存在。INTL_DISPLAYNAMES_EXISTS:JavaScript 内置类Intl.DisplayNames是否存在。INTL_DURATIONFORMAT_EXISTS:JavaScript 内置类Intl.DurationFormat是否存在。INTL_EXISTS:JavaScript 内置Intl命名空间是否存在。INTL_LISTFORMAT_EXISTS:JavaScript 内置类Intl.ListFormat是否存在。INTL_LOCALE_EXISTS:JavaScript 内置类Intl.Locale是否存在。INTL_NUMBERFORMAT_EXISTS:JavaScript 内置类Intl.NumberFormat是否存在。INTL_PLURALRULES_EXISTS:JavaScript 内置类Intl.PluralRules是否存在。INTL_RELATIVETIMEFORMAT_EXISTS:JavaScript 内置类Intl.RelativeTimeFormat是否存在。INTL_SEGMENTER_EXISTS:JavaScript 内置类Intl.Segmenter是否存在。INTL_SEGMENTER_ITERATOR_EXISTS:JavaScript 内置函数Intl.Segmenter.prototype[Symbol.iterator]是否存在。MAP_ENTRIES_EXISTS:JavaScript 内置函数Map.prototype.entries()是否存在。MAP_EXISTS:JavaScript 内置类Map是否存在。MAP_ITERATOR_EXISTS:JavaScript 内置函数Map.prototype[Symbol.iterator]是否存在。PROMISE_EXISTS:JavaScript 内置类Promise是否存在。PROXY_EXISTS:JavaScript 内置类Proxy是否存在。REFLECT_EXISTS:JavaScript 内置命名空间Reflect是否存在。REGEXP_EXISTS:JavaScript 内置类RegExp是否存在。REGEXP_ITERATOR_EXISTS:JavaScript 内置函数RegExp.prototype[Symbol.matchAll]是否存在。SET_ENTRIES_EXISTS:JavaScript 内置函数Set.prototype.entries()是否存在。SET_EXISTS:JavaScript 内置类Set是否存在。SET_ITERATOR_EXISTS:JavaScript 内置函数Set.prototype[Symbol.iterator]是否存在。SHAREDARRAYBUFFER_EXISTS:JavaScript 内置类SharedArrayBuffer是否存在。STRING_ITERATOR_EXISTS:JavaScript 内置函数String.prototype[Symbol.iterator]是否存在。SYMBOL_EXISTS:JavaScript 内置Symbol是否存在。SYMBOL_ITERATOR_EXISTS:JavaScript 内置函数Symbol.prototype[Symbol.iterator]是否存在。SYMBOL_MATCH_ALL_EXISTS:JavaScript 内置函数Symbol.prototype[Symbol.matchAll]是否存在。SYMBOL_TO_STRING_TAG_EXISTS:JavaScript 内置函数Symbol.prototype[Symbol.toStringTag]是否存在。UINT16ARRAY_EXISTS:JavaScript 内置类Uint16Array是否存在。UINT32ARRAY_EXISTS:JavaScript 内置类Uint32Array是否存在。UINT8ARRAY_EXISTS:JavaScript 内置类Uint8Array是否存在。UINT8CLAMPEDARRAY_EXISTS:JavaScript 内置类Uint8ClampedArray是否存在。WEAKMAP_EXISTS:JavaScript 内置类WeakMap是否存在。WEAKREF_EXISTS:JavaScript 内置类WeakRef是否存在。WEAKSET_EXISTS:JavaScript 内置类WeakSet是否存在。
以下代码展示如何使用这些常量:
import { WEAKMAP_EXISTS } from '@haixing_hu/type-detect';
function foo(value) {
if (WEAKMAP_EXISTS) {
...
} else {
...
}
}类型原型常量
这个库为 JavaScript 内建对象的原型提供了以下常量:
AggregateErrorPrototype:JavaScript内建AggregateError对象的原型,如果AggregateError类不存在,则为undefined。ArrayBufferPrototype:JavaScript内建ArrayBuffer对象的原型,如果ArrayBuffer类不存在,则为undefined。ArrayIteratorPrototype:JavaScript内建数组迭代器对象的原型,如果数组迭代器不存在,则为undefined。BigInt64ArrayPrototype:JavaScript内建BigInt64Array对象的原型,如果BigInt64Array类不存在,则为undefined。BigIntPrototype:JavaScript内建bigint基本类型的原型,如果bigint基本类型不存在,则为undefined。BigUint64ArrayPrototype:JavaScript内建BigUint64Array对象的原型,如果BigUint64Array类不存在,则为undefined。DataViewPrototype:JavaScript内建DataView对象的原型,如果DataView类不存在,则为undefined。FinalizationRegistryPrototype:JavaScript内建FinalizationRegistry对象的原型,如果FinalizationRegistry类不存在,则为undefined。Float32ArrayPrototype:JavaScript内建Float32Array对象的原型,如果Float32Array类不存在,则为undefined。Float64ArrayPrototype:JavaScript内建Float64Array对象的原型,如果Float64Array类不存在,则为undefined。Int16ArrayPrototype:JavaScript内建Int16Array对象的原型,如果Int16Array类不存在,则为undefined。Int32ArrayPrototype:JavaScript内建Int32Array对象的原型,如果Int32Array类不存在,则为undefined。Int8ArrayPrototype:JavaScript内建Int8Array对象的原型,如果Int8Array类不存在,则为undefined。IntelSegmentIteratorPrototype:JavaScript内建Intl.SegmentIterator对象的原型,如果Intl.SegmentIterator类不存在,则为undefined。InternalErrorPrototype:JavaScript内建InternalError对象的原型,如果InternalError类不存在,则为undefined。IntlCollatorPrototype:JavaScript内建Intl.Collator对象的原型,如果Intl.Collator类不存在,则为undefined。IntlDateTimeFormatPrototype:JavaScript内建Intl.DateTimeFormat对象的原型,如果Intl.DateTimeFormat类不存在,则为undefined。IntlDisplayNamesPrototype:JavaScript内建Intl.DisplayNames对象的原型,如果Intl.DisplayNames类不存在,则为undefined。IntlDurationFormatPrototype:JavaScript内建Intl.DurationFormat对象的原型,如果Intl.DurationFormat类不存在,则为undefined。IntlListFormatPrototype:JavaScript内建Intl.ListFormat对象的原型,如果Intl.ListFormat类不存在,则为undefined。IntlLocalePrototype:JavaScript内建Intl.Locale对象的原型,如果Intl.Locale类不存在,则为undefined。IntlNumberFormatPrototype:JavaScript内建Intl.NumberFormat对象的原型,如果Intl.NumberFormat类不存在,则为undefined。IntlPluralRulesPrototype:JavaScript内建Intl.PluralRules对象的原型,如果Intl.PluralRules类不存在,则为undefined。IntlRelativeTimeFormatPrototype:JavaScript内建Intl.RelativeTimeFormat对象的原型,如果Intl.RelativeTimeFormat类不存在,则为undefined。IntlSegmenterPrototype:JavaScript内建Intl.Segmenter对象的原型,如果Intl.Segmenter类不存在,则为undefined。MapIteratorPrototype:JavaScript内建Map迭代器对象的原型,如果Map迭代器不存在,则为undefined。MapPrototype:JavaScript内建Map对象的原型,如果Map类不存在,则为undefined。PromisePrototype:JavaScript内建Promise对象的原型,如果Promise类不存在,则为undefined。RegExpIteratorPrototype:JavaScript内建RegExp迭代器对象的原型,
为何无法检测Proxy类型
在JavaScript的设计中,Proxy对象的主要目的之一是允许开发者自定义对象操作的行为,它能代理另一个对象(即目标对象)。
Proxy最关键的特性之一便是其透明性——对于外部代码而言,除非代理对象被设计为有意暴露自身,
否则很难区别一个Proxy对象与其所代理的目标对象。这主要是因为Proxy能够拦截并重定义几乎所有的对象基础操作,
包括但不限于属性读取、设置以及属性的枚举。
因此,当使用type-detect等库尝试获取对象的类型信息时,由于Proxy的这种透明化特征,这些库仅能处理并"看见"最终的操作结果,
而无法直接判断这些操作是否受到Proxy的拦截。如果Proxy完美模仿了其所代理的目标对象的行为,那么就不存在一个可靠的方法,
通过操作结果来断定该对象是否为一个Proxy。简言之,Proxy的设计哲学在于使其自身对外部观察几乎不可见,因此,
除非代理对象特意通过某些拦截行为暴露其身份,否则即便是专门用于获取类型信息的库也无法确切判断一个对象是否为Proxy。
这样的设计极大地增强了Proxy的强大性和灵活性,但同时也意味着直接通过外部检测来识别Proxy对象将是一个挑战。
贡献
如果您发现任何问题或有改进建议,请随时在[GitHub仓库]中提出问题或提交拉取请求。
许可证
type-detect 在 Apache 2.0 许可下分发。有关更多详情,请参阅LICENSE文件。
