'use strict' const blocks = { symbols: '[\u2000-\u2bff]', cjk: '[\u2e80-\u9fff]', surrogates: '[\ud800-\udbff]', selectors: '[\ufe00-\ufe0f]' }; const valid = new RegExp(`^${Object.keys(blocks).map(key => blocks[key]).join('|')}$`); function emoji(char) { const buffer = new Buffer(char); let length = 0; if (buffer[0] >> 5 === 6) length = 2; if (buffer[0] >> 4 === 14) length = 3; if (buffer[0] >> 3 === 30) length = 4; if (!length) return false; for (let index = 1; index < length; index++) if (buffer[index] >> 6 !== 2) if (!valid.test(buffer[index].toString())) return false; return true; } console.log(emoji('😀')); // true console.log(emoji('x')); // false console.log(emoji('🇦🇩')); // true