js判断是个变量和属性是否是有效值
在严格判断中,“有意义的数据”通常指排除所有假值、空内容、无效结构的数据,具体包括:
- 排除
null
、undefined
、false
、0
、NaN
等基础假值; - 排除空字符串(
''
)、纯空格字符串(' '
); - 排除空数组(
[]
)、空对象({}
)、空Map
/Set
等无内容的引用类型; - 排除无效日期(
new Date('invalid')
)等结构无效的数据。
严格判断函数实现
以下是一个覆盖常见场景的严格判断函数,确保只有“真正有意义的数据”才被视为有效:
/*** 严格判断变量是否为有意义的有效值* @param {any} value - 需要判断的变量或属性值* @returns {boolean} 是否为有效值*/
function isValidValue(value) {// 1. 排除基础假值:null、undefined、false、0、NaNif (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(函数)
核心判断逻辑说明
- 基础类型:仅保留非空字符串(非纯空格)、非0数字、布尔真值。
- 引用类型:
- 数组/集合(Map/Set)必须有元素(
length > 0
或size > 0
); - 对象必须有自有属性(排除空对象
{}
); - 日期必须有效(
date.getTime()
不为NaN
)。
- 数组/集合(Map/Set)必须有元素(
- 边缘场景:函数、正则表达式等“有结构”的类型视为有效(即使无内容,其自身结构有意义)。
扩展说明
- 如果业务中
0
是有效数据(如“数量为0”),可移除value === 0
的判断; - 如果纯空格字符串需要视为有效(如用户输入的空格),可删除字符串判断中的
.trim()
; - 对于自定义对象(如类实例),可补充判断逻辑(如检查关键属性是否存在)。
此函数可根据具体业务场景微调,但核心思想是排除所有“无实际内容或结构无效”的数据。