参考:MDN - JavaScript 数据类型和数据结构
参考:JavaScript&ES6——可迭代对象与扩展运算符
JS 数据类型判断大全
一、获取对象原型(prototype)
1、getPrototype
function getPrototype(arg) {
// 返回对象 原型
return Object.prototype.toString.call(arg)
}
getPrototype([]) // 返回: '[object Array]'
二、原始类型(Primitive)
除了 Object 以外,所有类型都定义了表示在语言最低层面的不可变值。我们将这些值称为原始值。
除了 null
,所有原始类型都可以使用 typeof
运算符测试。typeof null
返回 "object"
,因此必须使用 === null
来测试 null
。
原始类型包含且仅包含以类型:
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
类型表示一个逻辑实体并且包括两个值:true
和 false
。
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,
}