空值实际上不是空值吗?

时间:2019-04-21 15:46:01

标签: javascript arrays string

我通过正则表达式错误地检查了"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"]

console

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

3 个答案:

答案 0 :(得分:3)

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

U + 200F是Unicode中的从右到左标记,将显示一个(不可见的)标记,用于更改方向文本。

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

let value = "\u200FAA81875\u200F17";

console.log(value.split('').map(function (x) { return x.charCodeAt(0); }));

value = value.replace(/\u200F/g, '');

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

答案 1 :(得分:1)

四个想法。

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: How do you get a string to a character array in JavaScript?

答案 2 :(得分:-2)

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

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

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