判断输入是否为空应优先使用 validity.valuemissing,其次用正则 /^\s*$/ 检测纯空白;避免 value === ""、!value 或 trim().length === 0 等错误方式,因不同 input type 对“空”定义不同。

直接用 element.value === "" 是错的——它漏掉全空格、制表符、换行符等“视觉为空但字符串非空”的情况;真正可靠的判断是结合原生 validity API 或正则匹配空白字符。
用 validity.valueMissing 判断必填项是否为空
这是浏览器原生校验最准的依据,比手动检查 value 字符串更可靠,尤其对 type="number" 或 type="date" 这类会自动 trim 或解析失败的控件:
-
required属性只在提交时触发,且仅当字段“未提供有效值”才设validity.valueMissing === true -
type="number"输入" 123 "不会触发valueMissing,但输入"abc"或空字符串会 -
type="date"未选择任何日期时为true,选了非法格式如"9999-99-99"仍为false(浏览器不解析) - 必须在
submit事件中调用checkValidity()或直接读取input.validity.valueMissing
用正则 /^\s*$/ 检测“纯空白输入”
当不需要 required、或要做实时提示(比如 blur 时)、或后端需要统一清洗逻辑时,这个正则最稳妥:
-
/^\s*$/能匹配空字符串、"\t\n "、" "(注意:HTML 实体不算 \s,需先解码) - 别用
.trim().length === 0——它会破坏 “北京 市朝阳区” 这类合法含空格内容 - 如果字段允许内部空格(如姓名、地址),只用它做“是否为空”判断,不要紧接着
.trim() - 前端验证只是体验层,后端仍需跑同样正则,不能信任前端裁剪结果
避免 value == "" 或 !value 的坑
这两种写法在多数情况下看似能工作,但会在边界 case 下静默失败:
-
!value对"0"、"false"、" "都返回true,误判严重 -
value == ""对"\n\t "返回false,漏掉首尾空白 -
value.length === 0同样漏掉全空白字符串,因为"\s\s".length !== 0 - 唯一安全的字符串级判断是
value.replace(/\s/g, '').length === 0,但性能略差,建议只在无validityAPI 的老环境用
真正容易被忽略的是:不同 input type 对“空”的定义完全不同——number 自动忽略首尾空格,date 只认 ISO 格式字符串,file 要看 input.files.length。别试图用一套逻辑通吃所有类型。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











