2

我正在努力保持时尚,所以我一直在玩传播运算符和表情符号。我注意到,当我想从生成的“扩展”数组中filter清空字符串 ( ) 时,不会删除空字符串。''这是为什么?

console.log([...'︎']);                 // ['︎', '']
console.log([...'︎'].filter(String));  // ['︎', '']
console.log(['︎', ''].filter(String)); // ['︎']

4

1 回答 1

4

您的字符串中有一个不可见的字符,它是一个变体选择器。如果您打印字符代码,您可以看到这一点:

console.log([...'︎'].map(s => s.charCodeAt(0)));

如果您的目标是删除特定的变体选择器 15,那么您可以只使用replace

s.replace(/\ufe0e/g, '')

请注意表情符号在您拥有的第三条语句的输出中略有不同。这是变体选择器的效果,您将其从前两个语句中的第一个字符中取出。虽然那个特殊字符本身不打印任何东西,并且在隔离时显示为空字符串,但它确实不是空的,因此filter不会排除它。

表情符号字符本身位于单个单词 UTF-16 范围之外,因此它们占据了两个单词。

当你用 分割这样一个单字符的字符串时split,你会得到两个单独的字符(JavaScript 的一个历史奇点),它们代表 UTF 编码。如果您的目标是计算字符串中的表情符号(和其他高范围字符),您可以使用以下代码:

console.log(s.split('').length - [...s].length);
于 2017-07-07T20:46:25.687 回答