当为 [2, 空属性 × 2, 3]的时候为什么一直为true?
这个问题的核心在于:你用的校验逻辑里 空数组元素(稀疏数组) 在 every
判断时可能被“跳过”了,所以 [2, , , 3]
这种情况也返回了 true
。
🔎 还原一下情况
假设你这样写的:
const arr = [2, , , 3]; // [2, empty × 2, 3]
arr.slice(0, 4).every(val => val !== '' && val !== null && val !== undefined);
结果会是 true。原因是:
- 稀疏数组的 空槽 (empty) 在
every
循环时会被忽略,不会执行回调。 - 也就是说
val
根本没跑到undefined
这一步。
所以 [2, , , 3]
实际上只检查了 [2, 3]
,自然返回 true
。
✅ 正确写法
你需要在校验前,把稀疏数组里的 空槽转成 undefined
,再去校验。
方法 1:用 map
转换
const arr = [2, , , 3];
const result = arr.slice(0, 4).map(v => v ?? null).every(val => val !== '' && val !== null && val !== undefined);
console.log(result); // false
方法 2:直接判断长度和是否都 truthy
const arr = [2, , , 3];
const result = arr.slice(0, 4).length === 4 && arr.slice(0, 4).every(val => !!val);
console.log(result); // false
方法 3:初始化时避免稀疏数组
当你定义 formData.taskValues
时,不要用空数组 []
直接 push,而是初始化成固定长度的数组,例如:
这样无论用户是否选择,都不会出现 empty × n
的坑位。
⚡ 总结:
[2, , , 3]
中的, ,
是 空槽 (hole),不是undefined
。every
会跳过空槽,所以导致逻辑失效。- 解决方法:初始化时填充空值 或者 在校验前统一转为 null/undefined。
要不要我帮你写一个 完整的表单初始化和校验示例,保证前四项都必须有值才返回 true?