npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@haixing_hu/type-detect

v1.2.0

Published

A JavaScript library for detecting common types

Downloads

230

Readme

type-detect

npm package License English Document CircleCI Coverage Status

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 内建的 ArrayBufferSharedArrayBuffer 对象。
  • isBuiltInClass(Class): boolean:指定类是否为 JavaScript 内建类。
  • isCollection(value): boolean:指定值是否为 JavaScript 内建的集合对象,即 MapSet 对象。 注意,WeakMapWeakSet 对象不被视为普通集合对象,它们可以通过 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 对象,即 FileBlobFileListFileReaderFileReaderSync 类的实例。
  • isGlobalObject(value): boolean: 指定值是否为全局对象.
  • isIntl(value): boolean:指定值是否为 JavaScript Intl 命名空间下的内建对象。
  • 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 内建的弱引用对象,即 WeakMapWeakSetWeakRef 对象。
  • 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文件。