这是一个非常常用的功能。主要有两种实现方式,一种是实现一个统一的isEmpty方法用于处理各种类型的判空。另一种则是提供单独的方法判断各类型是否为空。例如isEmptyString,isEmptyObject,isEmptyArray等。
统一的isEmpty方法(推荐)
像lodash这个库就提供isEmpty方法用于统一的判断是否为空。
优点:
简洁性和一致性:
提供单一入口点来检查任何类型的值是否为空,减少了重复代码。
易于维护:
修改或扩展功能只需在一个地方进行调整。
灵活性:
支持多种数据类型,适用于复杂的业务逻辑。
缺点:
性能开销:
对于某些简单的情况,可能会引入额外的判断步骤,导致轻微的性能下降。
复杂度增加:
处理多种类型可能导致代码较为复杂,难以理解和调试。
在看代码实现之前,有一个小知识点必须回顾一下。
在js中,下面的代码是返回true的。这是ES规范规定的。
undefined==null // true
知道了这个特性后,下面的这段代码就可以同时判断一个值是否是null或者undefined。
if(value==null){
return true
}
// 等同于
if(value===null||value===undefined){
return true
}
lodash的isEmpty代码实现:
const getTag = require('./_getTag'); // 获取内部标签名的方法
const isArrayLike = require('./isArrayLike'); // 判断是否类似数组
const isPrototype = require('./_isPrototype'); // 判断是否原型链上的对象
const nativeKeys = Object.keys; // 内置的 keys 方法
/**
* Checks if `value` is an empty object, collection, map, or set.
*
* Objects are considered empty if they have no own enumerable string keyed properties.
* Array-like values such as `arguments` objects, arrays, buffers, strings, typed arrays, maps, sets, & functions are considered empty if they have a length of `0`.
* Maps and sets are considered empty if they have a size of `0`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to inspect.
* @returns {boolean} Returns `true` if `value` is empty, else `false`.
*/
function isEmpty(value) {
if (value == null) {
return true;
}
if (
isArrayLike(value) &&
(Array.isArray(value) || typeof value.splice === 'function' ||
typeof value.indexOf === 'function')
) {
return !value.length;
}
const tag = getTag(value);
if (tag === '[object Map]' || tag === '[object Set]') {
return !value.size;
}
if (isPrototype(value)) {
return !nativeKeys(value).length;
}
for (const key in value) {
if (hasOwnProperty.call(value, key)) {
return false;
}
}
return true;
}
module.exports = isEmpty;
单独的判空方法
处理多种类型可能导致代码较为复杂,难以理解和调试。
分别实现特定类型的判空方法
优点:
清晰明了:
每个方法专注于特定类型的数据,便于阅读和理解。
性能优化:
只对特定情况进行必要的检查,减少不必要的计算。
细粒度控制:
更灵活地定义不同类型的“空”标准。
缺点:
代码冗余:
不同类型的判空方法会导致代码重复,不利于维护。
一致性问题:
各自独立的方法可能存在行为差异,容易造成混淆。
主要也就判断一个null或者undefined,或者是字符串类型的适合判断是否为空字符串。
判断字符串是否为空:
下面这三种写法都是等价的,建议写后面两种。
function isStringEmpty(str) {
return str === '' || str === null || str === undefined;
}
// 或者更简洁的形式
function isStringEmpty(str) {
return str == null || str.length === 0;
}
// 或者更简洁的形式
function isStringEmpty(str) {
return str == null || str==="";
}

被折叠的 条评论
为什么被折叠?



