2017-07-07 16 views
1

我试图保持时髦,所以我一直在玩spread operator和emojis。我注意到,当我想要filter空字符串('')出结果“传播”数组时,空字符串不会被删除。这是为什么?使用扩展语法从包含表情符号的字符串中过滤空字符串

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

+0

alert(''== 0);他们算作0 – nullqube

+1

肯定没有比传播运营商+ emojis更髋关节 – aw04

回答

2

有一个在你的字符串有不可见字符,这是一个variation selector。你可以看到这一点,如果你打印的字符代码:

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

如果你的目标是去除特定variation selector 15,那么你可以只使用一个replace

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

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

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

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

console.log(s.split('').length - [...s].length); 
+0

只是要张贴相同。为“空白字符”返回的字符代码实际上是'65038',我看到它被识别为[Unicode Character'VARIATION SELECTOR-15'(U + FE0E)](http://www.fileformat.info/info /unicode/char/fe0e/index.htm)。 – Santi

+0

Yuck,我讨厌表情。所以我可能需要这样做:'[...'︎']。filter(function(n){return n && n.charCodeAt(0)!= 65038;})' –

+0

取决于什么你想要做什么?你想把表情符号翻译成什么? – trincot