with special parse number characters caracter cadena buscar javascript string google-chrome unicode null-terminated

javascript - special - Carácter nulo en cadenas



parsefloat javascript (3)

Está preguntando sobre un comportamiento no uniforme (en todos los buscadores) del método alert() , por lo que no tiene nada que ver con el objeto Script y la especificación ECMAscript tal como está, se trata de cómo alert() muestra un objeto String.

alert() es un método del objeto Window y ECMAscript no lo define (solo le dice al entorno host que puede proporcionar objetos globales como el objeto ventana).

Pero sucede que es una especificación w3c que define el comportamiento de alert() , lamentablemente es muy escasa y no proporciona ninguna pista sobre cómo deben mostrarse los mensajes con caracteres nulos incorporados.

Así que este comportamiento es, como con cualquier otro detalle no especificado en la especificación, omitido para las implementaciones propias de los navegadores.

Considera esta cadena:

var s = "A/0Z";

Su longitud es 3, como se da por s.length . Usando console.log puede ver que la cadena no está cortada y que s[1] es "" y s.charCodeAt(1) es 0 .

Cuando lo alerta en Firefox, ve AZ . Cuando lo alerta en Chrome / Linux usando alert(s) , el /0 termina la cadena y ve A

Mi pregunta es: ¿qué deberían hacer los navegadores y los motores de Javascript? ¿Chrome tiene errores aquí? ¿Hay algún documento que defina lo que debería suceder?

Como esta es una pregunta acerca del estándar, se necesita una referencia.


JavaScript trata el carácter nulo como cualquier otro personaje, tu pregunta es cómo mostrarlo en cosole o en una alerta, varía en diferentes navegadores, no hay un estándar sobre esto, así que Chrome está bien.


Lo que el navegador debe hacer es realizar un seguimiento de la cadena y su longitud por separado ya que no hay terminadores nulos presentes en la norma. (Una cadena es solo un objeto con una longitud).

Lo que Chrome parece hacer (estoy tomando su palabra para esto) es usar las funciones estándar de cadena C que terminan en a / 0. Para responder a una de sus preguntas: Sí, esto para mí constituye un error en el manejo de Chrome de la función de alert() .

Formalmente, la especificación dice:

Un literal de cadena es cero o más caracteres encerrados entre comillas simples o dobles. Cada personaje puede estar representado por una secuencia de escape. Todos los caracteres pueden aparecer literalmente en un literal de cadena a excepción del carácter de comillas de cierre, barra inclinada invertida, retorno de carro, separador de línea, separador de párrafo y avance de línea. Cualquier personaje puede aparecer en la forma de una secuencia de escape.

También:

Un literal de cadena representa un valor del tipo de Cadena. El valor de cadena (SV) del literal se describe en términos de valores de caracteres (CV) aportados por las diversas partes de la cadena literal.

Y con respecto al byte NUL:

El CV [Valor de carácter] de EscapeSequence :: 0 [lookahead ∉ DecimalDigit] es un carácter <NUL> (valor Unicode 0000).

Por lo tanto, un byte NUL debería simplemente ser "otro valor de carácter" y no tener un significado especial, a diferencia de otros lenguajes donde podría terminar un SV (valor de cadena).

Para referencia de (válido) "Secuencias de escape de caracteres únicos de cadena", consulte la sección de especificaciones del lenguaje ECMAScript 7.8.4 . Hay una tabla al final del párrafo que enumera las secuencias de escape antes mencionadas.

Lo que alguien apunte a escribir un motor de Javascript probablemente pueda aprender de esto: No use las funciones de cadenas C / C ++. :)