[英]Empty value is not actually empty?
数组中的两个“空”值包含字符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) }
但是,请研究在空字符串上分割的重要性,并了解源字符串的编码。 由于您正在过滤,因此您无需在过滤之前进行更换。 单独过滤就足够了。 您希望将想要的值列入白名单,因为通过替换将其列入黑名单势必会给您带来麻烦。
不,您只应该将结果保存在新变量中:
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.