js判断内容是否为空(包括数组,对象,字符串)

这是一个非常常用的功能。主要有两种实现方式,一种是实现一个统一的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==="";
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值