@haixing_hu/type-detect
v1.2.0
Published
A JavaScript library for detecting common types
Downloads
230
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文件。