2017-07-07 52 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