2012-06-26 35 views
7

Vi % en muchos códigos. ¿Me puede explicar su propósito o lo que hace?¿Qué es el porcentaje (%) en JavaScript?

P.S: El % se ignora de las búsquedas de Google, por lo que no pude encontrarlo en Google.

Editar: Conozco el operando en matemáticas 13 % 10 = 3 pero lo que vi es como return %foo.

+0

Bueno, podrías intentar buscar 'percentage sign javascript'. Eso te llevaría a saber que es un operador de módulo. – bezmax

+1

'return% foo'? ¿Tienes un ejemplo más completo? No veo lo que podría ser eso. –

+0

@dystroy http://stackoverflow.com/a/7299040/1365010 por ejemplo – user1365010

Respuesta

9

Según el enlace que proporcionó en los comentarios, el carácter % parece usarse en algunos de los códigos fuente V8 JavaScript engine para indicar un método del tiempo de ejecución de C++ que se ejecutará al analizar el código fuente de JavaScript.

Por ejemplo, la línea en string.js:

return %StringBuilderConcat(parts, len + 1, ""); 

cuando se encuentran por el analizador, se ejecuta el método StringBuilderConcat. Puede encontrar una lista de los métodos de tiempo de ejecución disponibles para los archivos JavaScript de V8 en runtime.h (tenga en cuenta que no tengo experiencia con C++, por lo que sé que esto no tiene nada que ver con el StringBuilderConcat método mencionado en string.js, pero Creo que es lo mismo):

#define RUNTIME_FUNCTION_LIST_ALWAYS_1(F) \ 
    /* Property access */ \ 
    F(GetProperty, 2, 1) \ 
    F(KeyedGetProperty, 2, 1) \ 
    /* ... */ 
    F(StringBuilderConcat, 3, 1) \ 
    /* ... */ 

Como ya se ha dicho, return %foo podría lanzar una SyntaxError en JavaScript.

+0

Corrección secundaria: el analizador realmente no ejecuta ningún código en sí (con la excepción de '% IS_VAR' que causa un error de análisis si el argumento no es una variable). Parser solo crea el nodo CallRuntime AST (https://github.com/v8/v8/blob/master/src/parser.cc#L4720-4763). Los compiladores luego emiten llamadas a la función de tiempo de ejecución correspondiente (https://github.com/v8/v8/blob/master/src/ia32/full-codegen-ia32.cc#L3797-3834) o lo incorporan si es inlinable (ejemplo '% _IsSmi': https://github.com/v8/v8/blob/master/src/ia32/full-codegen-ia32.cc#L2518-2536). –

Cuestiones relacionadas