可能是你见过最全面的 JavaScript 类型判断大全

参考:MDN - JavaScript 数据类型和数据结构
参考:JavaScript&ES6——可迭代对象与扩展运算符

一、获取对象原型(prototype)

1、getPrototype

function getPrototype(arg) {
    // 返回对象 原型
    return Object.prototype.toString.call(arg)
}
getPrototype([]) // 返回: '[object Array]'

二、原始类型(Primitive)

除了 Object 以外,所有类型都定义了表示在语言最低层面的不可变值。我们将这些值称为原始值。

除了 null,所有原始类型都可以使用 typeof 运算符测试。typeof null 返回 "object",因此必须使用 === null 来测试 null

原始类型包含且仅包含以类型:
JS 原始类型

1、isPrimitive()

function isPrimitive(arg) {
    // 判断对象是否是 原子类型
    return (
        isNull(arg) || isUndefined(arg) || isSymbol(arg) ||
        isBoolean(arg) || isString(arg) ||
        isNumber(arg) || isBigInt(arg)
    )
}

2、isNull()

Null 类型只有一个值:null

function isNull(arg) {
    return Object.prototype.toString.call(arg) === '[object Null]'
}

3、isUndefined()

Undefined 类型只有一个值:undefined

从概念上讲,undefined 表示没有任何值,null 表示没有任何对象(这也可以构成 typeof null === "object" 的接口)。当某些东西没有值时,该语言通常默认为 undefined

  • 没有值(return;)的 return 语句,隐式返回 undefined
  • 访问不存在的对象属性(obj.iDontExist),返回 undefined
  • 变量声明时没有初始化(let x;),隐式初始化为 undefined
  • 许多如 Array.prototype.find()Map.prototype.get() 的方法,当没有发现元素时,返回 undefined
function isUndefined(arg) {
    return Object.prototype.toString.call(arg) === '[object Undefined]'
}

4、isBoolean()

Boolean 类型表示一个逻辑实体并且包括两个值:truefalse

function isBoolean(arg) {
    return Object.prototype.toString.call(arg) === '[object Boolean]'
}

5、isNumber()

仅能安全地存储在 -(253 − 1)(Number.MIN_SAFE_INTEGER)到 253 − 1(Number.MAX_SAFE_INTEGER)范围内的整数。

更多内容参考:MDN - Number

function isNumber(arg) {
    return Object.prototype.toString.call(arg) === '[object Number]'
}

6、isBigInt()

BigInt 类型在 Javascript 中是一个数字的原始值,它可以表示任意大小的整数。使用 BigInt,你可以安全地存储和操作巨大的整数,甚至超过 Number 的安全整数限制(Number.MAX_SAFE_INTEGER)。

更多内容参考:MDN - BigInt

function isBigInt(arg) {
    return Object.prototype.toString.call(arg) === '[object BigInt]'
}

7、isString()

String 类型表示文本数据并编码为 UTF-16 代码单位的 16 位无符号整数值序列。字符串中的每个元素在字符串中占据一个位置。第一个元素的索引为 0,下一个是索引 1,依此类推。字符串的长度是它的元素的数量。字符串的长度是其中的 UTF-16 代码单元的数量,这可能与 Unicode 字符的实际数量不符;更多细节参见 String 参考页面。

function isString(arg) {
    return Object.prototype.toString.call(arg) === '[object String]'
}

8、isSymbol()

Symbol唯一并且不可变的原始值并且可以用来作为对象属性的键(如下)。在某些程序语言当中,Symbol 也被称作“原子类型”(atom)。symbol 的目的是去创建一个唯一属性键,保证不会与其他代码中的键产生冲突。

function isSymbol(arg) {
    return Object.prototype.toString.call(arg) === '[object Symbol]'
}

三、可迭代类型(Iterable)

可迭代对象包括:Arrat、Set、Map、Arguments、String、Typed Array、Generators
注意:Object 不属于可迭代类型

其主要原因在于这 7 类对象是线性结构,且其构造函数的原型对象中具有 [Symbol.iterator] 迭代器,而 Object 是非线性结构,不具有迭代器。

function isIterable(arg) {
    // 判断对象是否是可迭代类型
    // 可迭代类型:Arrat、Set、Map、Arguments、String、Typed Array、Generators
    return isFunction(arg[Symbol.iterator])
}

1、isArray()

function isArray(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]'
}

2、isSet()

function isSet(arg) {
    return Object.prototype.toString.call(arg) === '[object Set]'
}

3、isMap()

function isMap(arg) {
    return Object.prototype.toString.call(arg) === '[object Map]'
}

4、isWeakSet()

function isWeakSet(arg) {
    return Object.prototype.toString.call(arg) === '[object WeakSet]'
}

5、isWeakMap()

function isWeakMap(arg) {
    return Object.prototype.toString.call(arg) === '[object WeakMap]'
}

四、其他类型

1、isElement()

function isElement(arg) {
    // 判断对象是否是 HTM*LElement
    return /HTML\w+Element/.test(Object.prototype.toString.call(arg))
}

2、isTypeofObject()

function isTypeofObject(arg) {
    // 判断 typeof 的返回值是否是 object
    return typeof(arg) === 'object'
}

3、isObject()

function isObject(arg) {
    return Object.prototype.toString.call(arg) === '[object Object]'
}

4、isFunction()

function isFunction(arg) {
    return Object.prototype.toString.call(arg) === '[object Function]'
}

5、isDate()

当表示日期时,最好的选择是使用在 JavaScript 内置的 Date 工具类。

function isDate(arg) {
    return Object.prototype.toString.call(arg) === '[object Date]'
}

6、isJSON()

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,来源于 JavaScript,同时也被多种语言所使用。JSON 构建了通用数据结构,可以在不同环境之间传输,甚至可以跨语言传输。更多细节,请参见 JSON

function isJSON(arg) {
    return Object.prototype.toString.call(arg) === '[object JSON]'
}

五、总结

// typeof.js

function getPrototype(arg) {
    // 返回对象 原型
    return Object.prototype.toString.call(arg)
}
function isIterable(arg) {
    // 判断对象是否是可迭代类型
    // 可迭代类型:Arrat、Set、Map、Arguments、String、Typed Array、Generators
    return isFunction(arg[Symbol.iterator])
}
function isComposite(arg) {
    // 判断对象是否是 复合数据类型
    return !isBasic(arg)
}
function isBasic(arg) {
    // 判断对象是否是 基础数据类型
    return (
        isSymbol(arg) || isBoolean(arg) || isString(arg) ||
        isNumber(arg) || isBigInt(arg) || isDate(arg)
    )
}
function isPrimitive(arg) {
    // 判断对象是否是 原始类型
    return (
        isNull(arg) || isUndefined(arg) || isSymbol(arg) ||
        isBoolean(arg) || isString(arg) ||
        isNumber(arg) || isBigInt(arg)
    )
}
function isConstant(arg) {
    // 判断对象是否是 常量
    return (
        isBoolean(arg) || isString(arg) ||
        isNumber(arg) || isBigInt(arg)
    )
}
function isElement(arg) {
    // 判断对象是否是 HTM*LElement
    return /HTML\w+Element/.test(Object.prototype.toString.call(arg))
}
function isTypeofObject(arg) {
    // 判断 typeof 的返回值是否是 object
    return typeof(arg) === 'object'
}
function isObject(arg) {
    return Object.prototype.toString.call(arg) === '[object Object]'
}
function isFunction(arg) {
    return Object.prototype.toString.call(arg) === '[object Function]'
}
function isDate(arg) {
    return Object.prototype.toString.call(arg) === '[object Date]'
}
function isMap(arg) {
    return Object.prototype.toString.call(arg) === '[object Map]'
}
function isSet(arg) {
    return Object.prototype.toString.call(arg) === '[object Set]'
}
function isWeakMap(arg) {
    return Object.prototype.toString.call(arg) === '[object WeakMap]'
}
function isWeakSet(arg) {
    return Object.prototype.toString.call(arg) === '[object WeakSet]'
}
function isArray(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]'
}
function isJSON(arg) {
    return Object.prototype.toString.call(arg) === '[object JSON]'
}
function isSymbol(arg) {
    return Object.prototype.toString.call(arg) === '[object Symbol]'
}
function isBoolean(arg) {
    return Object.prototype.toString.call(arg) === '[object Boolean]'
}
function isString(arg) {
    return Object.prototype.toString.call(arg) === '[object String]'
}
function isNumber(arg) {
    return Object.prototype.toString.call(arg) === '[object Number]'
}
function isBigInt(arg) {
    return Object.prototype.toString.call(arg) === '[object BigInt]'
}
function isNull(arg) {
    return Object.prototype.toString.call(arg) === '[object Null]'
}
function isUndefined(arg) {
    return Object.prototype.toString.call(arg) === '[object Undefined]'
}
// isProxy, isReactive, isRef, isReadonly 为 vue 内置函数

export {
    getPrototype,
    isIterable,
    isComposite,
    isBasic,
    isPrimitive,
    isConstant,
    isElement,
    isTypeofObject,
    isObject,
    isFunction,
    isDate,
    isMap,
    isSet,
    isWeakMap,
    isWeakSet,
    isArray,
    isJSON,
    isSymbol,
    isBoolean,
    isString,
    isNumber,
    isBigInt,
    isNull,
    isUndefined,
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值