繁体   English   中英

空值实际上不是空值吗?

[英]Empty value is not actually empty?

我通过正则表达式错误地检查了"AA8187517"字符串:

if (/^[a-z0-9]*$/i.test(value))

我突然在控制台中看到了什么?

> value.split('').filter(function(el){ return el != '' })
<  (11) ["", "A", "A", "8", "1", "8", "7", "5", "", "1", "7"]

安慰

数组中的这两个值是什么?

数组中的两个“空”值包含字符8207(十进制),即200f(十六进制)。

U + 200F是Unicode中的从右到左的标记,它显示(改变)了改变方向文本的标记。

这是您的问题的复制品,以及删除该字符的示例代码:

 let value = "\‏AA81875\‏17"; console.log(value.split('').map(function (x) { return x.charCodeAt(0); })); value = value.replace(/\‏/g, ''); console.log(/^[a-z0-9]*$/i.test(value)); 

四个想法。

1)在可行的情况下,我会使用显式正则表达式来代替修饰符。 警惕*量词,因为它可能允许太多, 包括缺少值 !!!

if (/^[A-Za-z0-9]*$/.test(value)) {

}

2)仔细检查Array.protoype.split()的定义,以及使用空字符串作为分隔符时会发生什么。

注意:如果将空字符串(“”)用作分隔符,则该字符串不会在每个用户感知的字符(字素簇)之间或在每个unicode字符(代码点)之间分割,而不会在每个UTF-16代码单元之间分割。 这会破坏代理对。 另请参见如何在JavaScript中将字符串获取到字符数组? 在stackoverflow上。

3) .trim()在这里对您有用吗?

value.trim().split('').filter(function(el){ return el != '' })

4)考虑更改您的过滤谓词(回调方法)。

value.trim().split('').filter(function(element){ return /^[A-Za-z0-9]{1}$/.test(element) }

但是,请研究在空字符串上分割的重要性,并了解源字符串的编码。 由于您正在过滤,因此您无需在过滤之前进行更换。 单独过滤就足够了。 您希望将想要的值列入白名单,因为通过替换将其列入黑名单势必会给您带来麻烦。

Stackoverflow:如何在JavaScript中将字符串获取到字符数组?

不,您只应该将结果保存在新变量中:

let array = ["text", "text2", '', 'text3'];

let a = array.filter((currentValue) => currentValue);
console.log(a); //["text", "text2", 'text3']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM