为何使用!=比较match()返回值与true仍返回true?
JavaScript中match()与true比较的逻辑解析
核心原因:match()的返回值类型不是布尔值
当正则表达式匹配成功时,match()返回的是包含匹配结果的数组(比如你的例子中返回["a"]),只有匹配失败时才返回null。
拆解你的代码逻辑
Boolean(num.match(/[a-z]/i))输出true
数组属于引用类型,JS中所有非空引用类型转换为布尔值时都会得到true,所以这里把匹配到的数组转成布尔值后是true。num.match(/[a-z]/i) != true输出true的原因
这是JS抽象不等比较(!=)的类型转换规则导致的:- 首先,
!=会先处理类型转换:布尔值true会被转换成数字1。 - 然后,数组会被转换成原始值:数组调用
toString()方法,得到字符串"a"。 - 接下来比较字符串
"a"和数字1:字符串会被尝试转换成数字,"a"转数字结果是NaN。 - 由于
NaN和任何值比较的结果都是false,所以"a" == 1为false,反过来"a" != 1就是true,最终你的表达式结果为true。
- 首先,
正确的判断方式
- 如果要基于
match()结果判断,直接将其转成布尔值后比较:console.log(Boolean(num.match(/[a-z]/i)) != true); // 此时结果为false,符合预期 - 更推荐使用
test()方法,它直接返回布尔值,性能也更优(无需创建匹配数组):console.log(/[a-z]/i.test(num) != true); // 结果为false
内容的提问来源于stack exchange,提问作者ImAWeebキズネです
相关产品推荐
相关产品推荐

