js判断是个变量和属性是否是有效值

发布于:2025-08-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

在严格判断中,“有意义的数据”通常指排除所有假值、空内容、无效结构的数据,具体包括:

  • 排除 nullundefinedfalse0NaN 等基础假值;
  • 排除空字符串('')、纯空格字符串(' ');
  • 排除空数组([])、空对象({})、空 Map/Set 等无内容的引用类型;
  • 排除无效日期(new Date('invalid'))等结构无效的数据。

严格判断函数实现

以下是一个覆盖常见场景的严格判断函数,确保只有“真正有意义的数据”才被视为有效:

/**
 * 严格判断变量是否为有意义的有效值
 * @param {any} value - 需要判断的变量或属性值
 * @returns {boolean} 是否为有效值
 */
function isValidValue(value) {
  // 1. 排除基础假值:null、undefined、false、0、NaN
  if (value === null || value === undefined) return false;
  if (typeof value === 'boolean' && value === false) return false;
  if (typeof value === 'number' && (value === 0 || isNaN(value))) return false;

  // 2. 处理字符串:排除空字符串和纯空格字符串
  if (typeof value === 'string') {
    return value.trim().length > 0; // 非空且非纯空格
  }

  // 3. 处理数组:排除空数组
  if (Array.isArray(value)) {
    return value.length > 0;
  }

  // 4. 处理对象(排除数组、null,因为 typeof null 是 'object')
  if (typeof value === 'object' && !Array.isArray(value)) {
    // 排除空对象(无自有属性)
    if (Object.keys(value).length === 0) return false;
    // 排除无效日期(如 new Date('invalid'))
    if (value instanceof Date && isNaN(value.getTime())) return false;
    // 其他对象默认有效(有结构即视为有意义)
    return true;
  }

  // 5. 处理 Map/Set:排除空集合
  if (value instanceof Map || value instanceof Set) {
    return value.size > 0;
  }

  // 6. 其他类型:函数、正则、非空引用等视为有效
  // (如函数、正则表达式、非空DOM元素等)
  return true;
}

关键场景测试用例

// 基础类型测试
console.log(isValidValue(null));          // false(null)
console.log(isValidValue(undefined));     // false(undefined)
console.log(isValidValue(''));            // false(空字符串)
console.log(isValidValue('   '));         // false(纯空格字符串)
console.log(isValidValue(0));             // false(数字0)
console.log(isValidValue(NaN));           // false(无效数字)
console.log(isValidValue(false));         // false(布尔假值)
console.log(isValidValue('hello'));       // true(非空字符串)
console.log(isValidValue(123));           // true(非0数字)
console.log(isValidValue(true));          // true(布尔真值)

// 引用类型测试
console.log(isValidValue([]));            // false(空数组)
console.log(isValidValue([1, 2]));        // true(非空数组)
console.log(isValidValue({}));            // false(空对象)
console.log(isValidValue({ name: 'a' })); // true(非空对象)
console.log(isValidValue(new Map()));     // false(空Map)
console.log(isValidValue(new Set([1])));  // true(非空Set)

// 特殊类型测试
console.log(isValidValue(new Date('invalid'))); // false(无效日期)
console.log(isValidValue(new Date()));          // true(有效日期)
console.log(isValidValue(/regex/));            // true(正则表达式)
console.log(isValidValue(() => {}));           // true(函数)

核心判断逻辑说明

  1. 基础类型:仅保留非空字符串(非纯空格)、非0数字、布尔真值。
  2. 引用类型
    • 数组/集合(Map/Set)必须有元素(length > 0size > 0);
    • 对象必须有自有属性(排除空对象 {});
    • 日期必须有效(date.getTime() 不为 NaN)。
  3. 边缘场景:函数、正则表达式等“有结构”的类型视为有效(即使无内容,其自身结构有意义)。

扩展说明

  • 如果业务中 0 是有效数据(如“数量为0”),可移除 value === 0 的判断;
  • 如果纯空格字符串需要视为有效(如用户输入的空格),可删除字符串判断中的 .trim()
  • 对于自定义对象(如类实例),可补充判断逻辑(如检查关键属性是否存在)。

此函数可根据具体业务场景微调,但核心思想是排除所有“无实际内容或结构无效”的数据


网站公告

今日签到

点亮在社区的每一天
去签到