String.lengthの意味
String.lengthはUTF-16のコードユニット数です。絵文字や一部の漢字は、2と数えられます。[...文字列].lengthならコードポイント数で数えられます。
見た目の1文字
Intl.Segmenterでgranularityをgraphemeにすると、見た目の1文字ごとに分けられます。ZWJで結合された家族の絵文字などは、複数のコードポイントで1文字になります。
正規化とバイト数
normalize('NFKC')を使うと、全角と半角の英数字を揃えて比較できます。バイト数はTextEncoder().encode(文字列).lengthで求まり、UTF-8では日本語の文字は多くが3バイトです。