¿Es posible que string.length !== string.toLowerCase().length ?
Sé que es posible para toUpperCase , dadas las respuestas en Change to .length with toUpperCase? , pero no sé si es posible para toLowerCase .
Sí, es posible, no todas las asignaciones de mayúsculas y minúsculas son de uno a uno, también pueden ser de uno a muchos, como ha visto al pasar de minúsculas a mayúsculas, lo mismo puede aplicarse al pasar de mayúsculas a minúsculas. Esto se puede ver con el carácter LETRA I MAYÚSCULA LATINA CON PUNTO ARRIBA (0x0130):
const char = "\u0130"; // İ const charLower = char.toLowerCase(); console.log(char, char.length); // İ 1 console.log(charLower, charLower.length); // i̇ 2 console.log(char.length !== charLower.length); // trueHay una nota en la especificación que también destaca este comportamiento en la sección 22.1.3.26 :
El mapeo de casos de algunos puntos de código puede producir múltiples puntos de código. En este caso, la cadena de resultado puede no tener la misma longitud que la cadena de origen.
Puede encontrar una lista de asignaciones de casos especiales (es decir, asignaciones de casos que no son necesariamente uno a uno) en la base dedatos de caracteres Unicode (UCD). Como se indica, la longitud de algunos caracteres solo crece bajo ciertas condiciones, algunas de las cuales dependen de contextos y lugares específicos:
// From the UCD for SpecialCasings, another example can be found: // 012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK // The above means '012E' maps to the lower case of '012F 0307' if: // - the locale is Lithuanian (lt) // - the suffix contains a character of combining class 230 (Above) // \u0300 is a character with such a combining class value (list found here: https://www.compart.com/en/unicode/combining/230) const grapheme = '\u012E\u0300'; // Į̀ (Į + ̀ ) console.log(grapheme, grapheme.length); // Į̀ 2 const lowerStd = grapheme.toLowerCase(); console.log(lowerStd, lowerStd.length); // į̀ 2 (still fine) const lowerLocale = grapheme.toLocaleLowerCase('lt'); console.log(lowerLocale, lowerLocale.length); // į̇̀ 3 (now 3 when using lt as the locale)