数据类型工具函数
2024/9/11大约 5 分钟
本文档整理了常用的数据类型处理工具函数,主要用于各种数据类型的检测、转换和验证,适用于日常开发中常见的数据类型处理场景。
判断是否为 JSON 字符串
实现代码
/**
* 判断是否为JSON字符串
* @param str 字符串
* @returns 判断结果
*/
function isJSON(str) {
let result = false;
if (typeof str == "string") {
try {
const obj = JSON.parse(str);
if (typeof obj == "object" && obj) {
result = true;
}
} catch (e) {
result = false;
}
}
return result;
}
代码解析
该函数用于检测一个字符串是否可以被解析为有效的 JSON 对象:
- 类型初步检查:首先检查输入是否为字符串类型,只有字符串才可能是 JSON 字符串。
- JSON 解析尝试:使用
try...catch
结构尝试通过JSON.parse()
解析字符串。 - 解析结果验证:解析成功后,进一步验证结果是否为非空对象(排除
null
)。 - 返回结果:根据验证结果返回布尔值。
使用方法
// 有效的JSON字符串
isJSON('{"name":"John","age":30}'); // 输出: true
isJSON("[1, 2, 3]"); // 输出: true
// 无效的JSON字符串
isJSON("not a json string"); // 输出: false
isJSON("{name:John}"); // 输出: false (属性名必须加引号)
// 非字符串输入
isJSON({ name: "John" }); // 输出: false
isJSON(null); // 输出: false
判断是否为数组
实现代码
/**
* 判断是否为数组
* @param arr 要判断的值
* @returns 判断结果
*/
function isArray(arr) {
if (typeof Array.isArray === "function") {
return Array.isArray(arr);
} else {
return Object.prototype.toString.call(arr) === "[object Array]";
}
}
代码解析
该函数用于检测一个值是否为数组类型:
- 优先使用原生方法:如果环境支持
Array.isArray()
方法,则优先使用它,这是最可靠的数组检测方法。 - 兼容性处理:对于不支持
Array.isArray()
的旧环境,使用Object.prototype.toString.call()
方法获取对象的内部[[Class]]
属性值进行判断。 - 返回结果:根据检测结果返回布尔值。
使用方法
// 数组检测
isArray([]); // 输出: true
isArray([1, 2, 3]); // 输出: true
// 非数组检测
isArray({}); // 输出: false
isArray("array"); // 输出: false
isArray(null); // 输出: false
isArray(undefined); // 输出: false
判断是否为空对象
实现代码
/**
* 判断是否为空对象
* @param obj 要判断的对象
* @returns 判断结果
*/
function isEmptyObject(obj) {
// 首先检查是否为对象且不为null
if (obj === null || typeof obj !== "object") {
return false;
}
// 处理数组情况
if (isArray(obj)) {
return obj.length === 0;
}
// 处理普通对象
try {
// 检查是否有可枚举属性
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
return false;
}
}
return true;
} catch (e) {
return false;
}
}
代码解析
该函数用于检测一个值是否为空对象或空数组:
- 基本类型检查:首先检查输入是否为对象且不为
null
,否则直接返回false
。 - 数组处理:如果是数组,直接检查其
length
属性是否为 0。 - 对象属性检查:对于普通对象,遍历其所有可枚举属性,如果存在自有属性(通过
hasOwnProperty
判断),则返回false
。 - 异常处理:使用
try...catch
捕获可能的遍历异常。
使用方法
// 空对象检测
isEmptyObject({}); // 输出: true
isEmptyObject([]); // 输出: true
// 非空对象检测
isEmptyObject({ name: "John" }); // 输出: false
isEmptyObject([1, 2, 3]); // 输出: false
// 非对象检测
isEmptyObject(null); // 输出: false
isEmptyObject(""); // 输出: false
判断是否为日期对象
实现代码
/**
* 判断是否为日期对象
* @param date 要判断的值
* @returns 判断结果
*/
function isDate(date) {
return (
Object.prototype.toString.call(date) === "[object Date]" &&
!isNaN(date.getTime())
);
}
代码解析
该函数用于检测一个值是否为有效的日期对象:
- 类型检查:使用
Object.prototype.toString.call()
方法获取对象的内部[[Class]]
属性值,检查是否为[object Date]
。 - 有效性检查:通过调用
date.getTime()
并检查结果是否为NaN
,确保日期对象是有效的(非无效日期)。
使用方法
// 有效日期对象
isDate(new Date()); // 输出: true
isDate(new Date("2022-01-01")); // 输出: true
// 无效日期对象或非日期
isDate(new Date("invalid date")); // 输出: false (虽然是Date对象,但无效)
isDate("2022-01-01"); // 输出: false
isDate(null); // 输出: false
判断是否为数字
实现代码
/**
* 判断是否为数字
* @param num 要判断的值
* @param options 配置选项
* @returns 判断结果
*/
function isNumber(num, options = {}) {
const { allowNaN = false, allowInfinity = false } = options;
if (typeof num !== "number") {
return false;
}
if (!allowNaN && isNaN(num)) {
return false;
}
if (!allowInfinity && !isFinite(num)) {
return false;
}
return true;
}
代码解析
该函数用于检测一个值是否为数字类型,并提供了配置选项以决定是否允许 NaN
和 Infinity
:
- 类型检查:首先检查输入是否为
number
类型。 - NaN 处理:根据
allowNaN
选项决定是否允许NaN
值。 - Infinity 处理:根据
allowInfinity
选项决定是否允许Infinity
和-Infinity
值。 - 返回结果:根据检测和配置选项返回布尔值。
使用方法
// 基本数字检测
isNumber(123); // 输出: true
isNumber(0); // 输出: true
isNumber(-123); // 输出: true
isNumber(3.14); // 输出: true
// 特殊值检测
isNumber(NaN); // 输出: false
isNumber(Infinity); // 输出: false
// 配置选项
isNumber(NaN, { allowNaN: true }); // 输出: true
isNumber(Infinity, { allowInfinity: true }); // 输出: true
// 非数字检测
isNumber("123"); // 输出: false
isNumber(null); // 输出: false
isNumber(undefined); // 输出: false
更新日志
2025/9/28 09:03
查看所有更新日志
38e56
-于