Собственный набор символов JavaScript и веб-браузеров в целом - UTF-16. Строки - это последовательности единиц кода UTF-16. Не существует понятия "двухбайтовые" кодировки символов.
Если вы хотите вычислить, сколько байтов строка займет в конкретной двухбайтовой кодировке, вам нужно знать, что это за кодировка и как ее кодировать самостоятельно; эта информация не будет доступна для JavaScript изначально. Так, например, для Shift_JIS вам нужно знать, какие символы являются кана, которые могут быть закодированы в один байт, а какие участвуют в двухбайтовых последовательностях кандзи.
Не существует кодировки, в которой все кодовые единицы, представляющие ASCII, представлены в одном байте, а все кодовые единицы, кроме ASCII, - в двух байтах, поэтому любой вопрос, который вы пытаетесь решить, считая не-ASCII двумя, цикл и -адд, наверное, не правильный ответ.
В любом случае двухбайтовые кодировки старой школы представляют собой ужасный анахронизм, которого следует избегать, когда это возможно. Если вам нужно кодирование байтов с эффективным использованием пространства, вам нужен UTF-8. Легко вычислить длину строки в байтах UTF-8, потому что в JS есть скрытый встроенный кодер UTF-8, который вы можете использовать:
var byten= unescape(encodeURIComponent(chars)).length;
Обрезать строку до 400 байт несколько сложнее, потому что вы хотите избежать прерывания многобайтовой последовательности. Вы получите исключение, если попытаетесь UTF-8-декодировать что-то с прерванной последовательностью в конце, поэтому поймайте это и попробуйте снова:
var bytes= unescape(encodeURIComponent(chars)).slice(0, 400);
while (bytes.length>0) {
try {
chars= decodeURIComponent(escape(bytes));
break
} catch (e) {
bytes= bytes.slice(0, -1);
}
}
Но необычно хотеть ограничить ввод, основанный на количестве байтов, которые он займет в конкретной кодировке. Прямой лимит на количество символов гораздо более типичен. Что ты пытаешься сделать?