跳转至

当为 [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,而是初始化成固定长度的数组,例如:

formData: {
  taskValues: Array(4).fill('') // ["", "", "", ""]
}

这样无论用户是否选择,都不会出现 empty × n 的坑位。


⚡ 总结:

  • [2, , , 3] 中的 , ,空槽 (hole),不是 undefined
  • every 会跳过空槽,所以导致逻辑失效。
  • 解决方法:初始化时填充空值 或者 在校验前统一转为 null/undefined

要不要我帮你写一个 完整的表单初始化和校验示例,保证前四项都必须有值才返回 true?