2010-11-03 4 views
8

En el capítulo 7.7 (Punctators) de la especificación de ECMAScript (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf) la cuadrícula de puntuadores parece tener un espacio en la fila 3 de la última columna. Este es, de hecho, el punctor del personaje espacial, ¿correcto?El carácter de espacio como un punctor en JavaScript

entiendo que los caracteres de espacio pueden insertarse opcionalmente entre fichas en el código JavaScript (con el fin de mejorar la legibilidad), sin embargo, me preguntaba dónde están realmente necesaria ...

Con el fin para averiguarlo, busqué caracteres espaciales en la versión minificada de la biblioteca jQuery. Estos son mis resultados:

Un espacio se requiere ... (ver el link debajo)

... entre una palabra clave y un identificador:

function x(){} 
var x; 
return x; 
typeof x; 
new X(); 

... entre dos palabras clave :

return false; 
if(x){}else if(y){}else{} 

Estos son los dos casos que identifiqué. ¿Hay algún otro caso?

Nota: Los caracteres espaciales dentro de los literales de cadena no se consideran tokens de punctuación (obviamente).

Actualización: Como resultado, un carácter de espacio es no requerido en esos casos. Por ejemplo, un token de palabra clave y un token de identificador deben separarse por algo, pero ese algo no tiene que ser un carácter de espacio. Podría ser cualquier elemento de entrada que no sea un token (WhiteSpace, LineTerminator o Comment).

también ... Parece que el carácter de espacio es considerado como un elemento WhiteSpace de entrada, y no un símbolo en absoluto, lo que significaría que que no es un Punctuator.

+1

Para este tipo de preguntas y sus otros excelentes preguntas sobre el idioma, se encuentra el los clientes habituales en el grupo de noticias comp.lang.javascript (http://groups.google.com/group/comp.lang.javascript/topics) están muy bien informados.La multitud de Stack Overflow generalmente tiene una mentalidad más práctica. –

+0

@Tim Puedo considerar recurrir al grupo de noticias, pero solo si no obtengo una buena respuesta aquí. Pero hasta ahora, estoy muy satisfecho con las respuestas ... Además, SO tiene un gran rango de páginas. Esta pregunta es el resultado del segundo puesto en una búsqueda en Google de "javascript punctuators" :) –

Respuesta

1

Los espacios en blanco son no es necesario en ninguno de estos casos. Solo tiene que escribir una sintaxis que sea comprensible para el analizador. En otras palabras: la máquina debe saber si está utilizando una palabra clave como function o new o simplemente está definiendo otra variable como newFunction.

Cada palabra clave tiene que ser delimitado de alguna manera - espacios en blanco son los más sensibles y de fácil lectura, sin embargo pueden ser reemplazados:

return/**/false; 
return(false); 
4

No creo que la brecha sea un espacio, no, creo que es solo una brecha (una desafortunada). Si realmente quisieran incluir un espacio en la lista, espero que utilicen "Espacios en blanco" como lo han hecho en otras partes del documento. Pero el espacio en blanco como puntuador realmente no tiene sentido.

Creo que los espacios (y otras formas de espacios en blanco) son delimitadores. El tipo de especificación los define por omisión en lugar de explícitamente. El espacio es requerido entre function y x porque de lo contrario tiene el token functionx, que no es, por supuesto, una palabra clave (aunque podría ser un token de nombre   —, por ejemplo, una variable, propiedad o nombre de función).

Usted necesita delimitadores alrededor de algunas fichas (Identificadores y ReservedWords), porque así es como reconocemos donde comienzan las fichas y terminamos   — un IdentifierName se inicia con un IdentifierStart seguido de cero o más IdentifierParts, una clase que no incluye espacios en blanco ni ninguno de los caracteres utilizados para los puntuadores. Otros tokens (Punctuators por ejemplo) podemos reconocer sin delimitadores. Creo que eso es todo, y entonces sus dos reglas son solo dos ejemplos de la misma regla: IdentifierNames deben estar delimitados (por espacios en blanco, por puntuación, al principio o al final del archivo, ...).

Algo fuera de tema, pero, por supuesto, no todos los delimitadores son iguales. Los delimitadores de salto de línea a veces son tratados especialmente por la gramática para el horror que es "inserción de punto y coma".

+0

@Crowder Pero, ¿por qué hay un espacio en la red entonces? Debe ser intencionalmente. Está en la 3ª y en la 5ª edición, que llegó 10 años después. Así que tuvieron tiempo suficiente para formatear las especificaciones de forma adecuada. –

+0

Es difícil decir si se supone que esa brecha es un espacio en blanco, pero es correcto que los caracteres de espacio en blanco sean tratados por igual. Por ejemplo, puede declarar 'else \t if' con una pestaña, o incluso una nueva línea, separando' else' y 'if'. Los espacios en blanco son delimitadores, cuando se considera algo como '1 .toFixed (2)'. –

+0

@ Šime Vidas: Después de haber visto el documento de especificación hasta llegar a una copia final (e interactué un poco con el tipo que lo supervisaba), no estoy para nada sorprendido de encontrar una edición ... * rareza * ... de ese tipo. Ni siquiera un poquito. Considere que el título del PDF es "Proyecto final final final Standard Standard ECMA-262 5th Edition" y obtiene * algún * sentido de lo cansados ​​que estaban de editarlo. ;-) –

0

Esto es sólo una suposición, pero diría que los espacios no son realmente necesarios en ningún lado. Se utilizan como una de las muchas alternativas para generar límites entre las palabras clave. Esto significa que podrías reemplazarlos con otros personajes.

Si lo que desea es eliminar los espacios innecesarios de algún código, diría que los espacios (espacio en blanco para ser más exactos, las pestañas funcionarán igual de bien) son obligatorios solo cuando no hay otro medio para separar palabras clave y/o identificadores de variables. Es decir. donde al eliminar el espacio en blanco ya no tiene las mismas palabras clave e identificadores en el código resultante.


Lo que sigue no es exactamente relevante para sus necesidades, pero puede que le resulte interesante. Puede escribirle ejemplos para que ya no tengan esos espacios. Espero que ninguno de los ejemplos sea incorrecto.

x=function(){} en lugar de function x(){}
this.x=null; en lugar de var x;
return(x); en lugar de return x;
typeof(x); en lugar de typeof x;
y=X(); en lugar de y = new X();
return(false) en lugar de return false
if(x){}else{if(y){}else{}} instea d de if(x){}else if(y){}else{}

+0

Mmmmm ... interesante. Pero las llaves no funcionarán para 'function',' var' y 'new', ¿verdad? –

+0

No. No creo que pueda adjuntar en ninguno de esos casos. Pero, como lo hizo Crozin en su respuesta, puede agregar bloques de comentarios de varias líneas prácticamente en cualquier parte. Para la función, puedes engañar usando 'fn = function', pero no se te ocurre nada en otros casos. –

+0

Para nuevo, simplemente no puedes escribirlo, creo. Por favor corrígeme si estoy equivocado. –

Cuestiones relacionadas