密码强度校验中RegExp匹配undefined返回意外结果,求原因
为什么undefined会让你的密码正则检查返回true?
这事儿我之前也踩过坑!问题核心出在JavaScript对undefined的隐式类型转换上。
当你把undefined传给正则的test()方法时,JS会自动把它转换成字符串"undefined"——你仔细看这个字符串,里面全是小写字母对吧?所以检查是否包含小写字符的正则自然会返回true,而检查大写的因为字符串里没有大写字母,所以返回false,这就和你预期的两次都返回false不符了。
给你个直观的代码例子验证一下:
const hasLower = /[a-z]/.test(undefined); const hasUpper = /[A-Z]/.test(undefined); console.log(hasLower); // 输出 true console.log(hasUpper); // 输出 false
怎么解决这个问题?
最简单的方案是先做输入校验,过滤掉undefined、null这类非有效字符串的情况,再执行正则检查:
function validatePasswordStrength(password) { // 先判断是否为有效字符串 if (typeof password !== 'string' || password.trim().length === 0) { return false; } const hasLower = /[a-z]/.test(password); const hasUpper = /[A-Z]/.test(password); return hasLower && hasUpper; }
这样当传入undefined时,会直接返回false,完全符合你的预期。
内容的提问来源于stack exchange,提问作者jedrzej.kurylo
相关产品推荐
相关产品推荐

