知らなかったら、嵌ると思って備忘録として残しておきます。
先に結論としてコードを載せておきます。
var msg = "こんにちは";
console.log(msg.length);
//5
var msg2 = "𩸽";
console.log(msg2.length);
//2
単純に変数msg msg2の文字列を数えていますが、msgの「こんにちは」は5文字としっかりカウントできてます。
しかし、msg2の「𩸽」(ほっけと読みます)は1文字にも関わらず2文字としてカウントされてしまってます。
これは、𩸽という字がサロゲートペアとして扱われているからだそうです!
サロゲートペア
Unicode(UTF-16)は1文字を2バイトで表現していますが、Unicodeで扱う文字列が増えて65535文字では対応できないという事になったので、一部の文字を4バイトで表現する事で文字数を拡張したそうです。
lengthプロパティはサロゲートペアである文字列を識別できないので、4バイトの文字=2文字として文字数をカウントしていたので、msg2の結果が2となっています。
対策
var msg2 = "𩸽";
var num = msg2.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g).length -1;
console.log(num);
// 1
console.log(msg2.length - num);
//1
参考
https://qiita.com/wingsys/items/81d46451d8b93ab065de
https://qiita.com/sounisi5011/items/aa2d747322aad4850fe7
https://jsprimer.net/basic/string-unicode/