当为 [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?