¿Cuál es la diferencia entre return y return ()?

97
function a() { return 1; }
function b() { return(1); }

Probé el código anterior en la consola de Chrome y ambos regresaron 1.

function c() { return "1"; }
function d() { return("1"); }

También probé el código anterior y ambas funciones regresaron "1".

Entonces, ¿cuál es la diferencia entre usar returny return()?

chris97ong
fuente
21
Las respuestas aquí también se aplicarán a void(x),typeof(x)
Paul S.
3
@ PaulS. — siempre me desconcertó, void(0)ya que se supone que es la abreviatura de indefinido . Entonces, si es taquigrafía, ¿por qué incluir caracteres innecesarios? ;-)
RobG
1
@RobG Creo que es una transferencia a partir de Python y de hecho puede ser útil para casos especiales en los que desea incluir operadores void i = 1; // ReferenceErrorvsvoid (i = 1); // undefined
Paul S.
1
Es posible que le divierta esta pregunta, que es su pregunta aplicada a C #: stackoverflow.com/questions/2186595/…
Eric Lippert
3
posible duplicado de Por qué usar paréntesis al regresar en Javascript
Qantas 94 Heavy

Respuestas:

177

Lo mismo que entre

var i = 1 + 1;

y

var i = (1 + 1);

Eso no es nada. Los paréntesis están permitidos porque están permitidos en cualquier expresión para influir en el orden de evaluación, pero en sus ejemplos son simplemente superfluos.

returnno es una función, sino una declaración . Es sintácticamente similar a otras declaraciones de flujo de control simples como breaky continueque tampoco usan paréntesis.

RemcoGerlich
fuente
12
Una declaración de retorno puede ir seguida de una expresión. Un retorno debe estar en una función, por lo que la función devuelve el valor de la expresión, o si no lo hay, indefinido .
RobG
37
@ chris97ong: return no es una función.
RemcoGerlich
34
Si hiciera returnuna función, ¿cómo devolvería un valor de ella?
dan04
4
Esta es una gran respuesta con un gran ejemplo, pero creo que puede valer la pena agregar que 'retorno' no es una función en la respuesta principal, considerando que es la raíz del malentendido que llevó a esta pregunta.
BiscuitBaker
3
@BiscuitBaker: agregué un poco. Cuando anoté esta breve respuesta, no esperaba que obtuviera más de 50 votos a favor ...
RemcoGerlich
21

No hay diferencia.

returnno es una llamada de función, sino una declaración de lenguaje. Todo lo que está haciendo con los paréntesis es simplemente agrupar su valor de retorno para que pueda evaluarse. Por ejemplo, podrías escribir:

return (x == 0);

En este caso, devuelve el valor de la declaración x == 0, que devolverá un booleano trueo falsedependiendo del valor de x.

alpartis
fuente
6
return es una palabra clave que significa el inicio de una declaración return .
RobG
1
La evaluación de la declaración de devolución no necesita "agrupamiento". Entonces, en cualquier caso, habrá un retorno booleano.
Wolf
18

En realidad, aquí la precedencia de ()es mayor, por lo que se evalúa primero:

Aquí en primer lugar ("1")ser evaluado, de la siguiente manera:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

entonces la declaración anterior es equivalente a:

return "1";

Ver visualmente:

viusal

Entonces, básicamente, no hay diferencia en la funcionalidad, pero la segunda puede ser un poco lenta, ya que en primer lugar resuelve los corchetes.

Zaheer Ahmed
fuente
2
¿Por qué haría una afirmación completamente no verificada de que "el segundo podría ser un poco más lento" cuando ese no es el caso?
9

No hay absolutamente ninguna diferencia. Si observa la especificación JS (ECMAScript) de la declaración de devolución . Entre muchas otras cosas, te está diciendo:

return [no LineTerminator aquí] Expresión;

a los que puedes dar expresión return. La expresión es hello, Math.abs(x), yourCustomFunc(7), o en su segundo caso esto puede ser 1o (1). La expresión 1después de la evaluación es lo mismo (1)y lo mismo (((((1))))))o incluso como algo realmente extraño (+(!(+(!1)))).

Salvador Dalí
fuente
1
+1 para la referencia oficial. ¿No hay una referencia página por página? - El HTML de una página se carga mucho.
Wolf
@Lobo no he encontrado tal. Aquí hay otro, pero también es una página people.mozilla.org/~jorendorff/…
Salvador Dali
Sí, triste. Tampoco tendría éxito. ¿Qué hay de ampliar su cotización a toda la sintaxis de la declaración de devolución?
Wolf
9

No hay diferencia, los paréntesis son opcionales. Ver MSDN :

return[(][expression][)];

El argumento de expresión opcional es el valor que se devolverá de la función. Si se omite, la función no devuelve ningún valor.

Utiliza la declaración de retorno para detener la ejecución de una función y devolver el valor de expresión. Si se omite la expresión o no se ejecuta ninguna instrucción de retorno desde dentro de la función, a la expresión que llamó a la función actual se le asigna el valor indefinido.

Evan Knowles
fuente
8
Solo MS pensaría en hacer que la agrupación sea "opcional" en una declaración de devolución . Son tan "opcionales" allí como en cualquier expresión, o en muchas otras partes de la gramática.
RobG
@RobG: Pero aparentemente, es mucho más probable que se les pregunte en un returncomunicado. : P MS probablemente se cansó de responder la pregunta de JS noobs.
cHao
2
La explicación de M $ es incorrecta. El (), no es parte de la declaración de devolución.
Salman A
4
"Hay una diferencia para el lector". Bueno, sí: la especificación de MSDN implica erróneamente que return (expressiony return expression)son legales.
Jim Balter
2
@JimBalter Junto con return (), return (y return ): P
Paul
9

returnes una declaración una palabra clave que inicia la declaración de retorno , no una función.

Como se ha mencionado, los paréntesis adicionales afectan el orden de evaluación, pero no se utilizan para "ejecutar" la función nombrada return. Por eso estas líneas funcionan sin problemas:

return (1);
var a = (1);

Son, en efecto, idénticos a estas líneas:

return 1;
var a = 1;

La razón return()por la que se produce un error de sintaxis es la razón exacta por la que la siguiente línea arroja un error (se incluye una declaración de retorno para la comparación):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error
IQAndreas
fuente
Y solo como nota al margen, si returnno incluye nada después, asume que desea regresar undefined.
IQAndreas
@Wolf Las expresiones son opcionales, returnpor lo que en sí mismas son una declaración de retorno.
Paul
6

Hay una gran diferencia para los humanos y cero para el motor Javascript.

return 1es una declaración que declara que debemos salir inmediatamente de la función que produce el valor 1.

return(1)es la misma declaración disfrazada como llamada de función por la convención idiota de que no está obligado a insertar espacio fuera de paréntesis en Javascript. Si usa un código como este en el sistema de producción, cualquier mantenedor vendrá a su oficina con estacas y antorchas, después de pasar algún tiempo tratando de decidir si realmente tiene una return()función en algún lugar del código base o simplemente no sabe para qué returnsirve la palabra clave.

Como muchas otras personas ya han dicho correctamente, los paréntesis no hacen nada excepto "agrupar" con mayor precedencia que el literal del número 1.

hijarian
fuente
3
"Hay una gran diferencia para los humanos", no para los competentes. "la misma declaración disfrazada como la llamada de función" - no hay returnfunción. "la estúpida convención de que no está obligado a insertar espacio fuera del paréntesis en Javascript" - casi ningún lenguaje lo requiere; llamar a esto idiota es idiota. "cualquier mantenedor vendrá a su oficina con estacas y antorchas", nadie competente lo haría. return(1)Es una mala práctica, pero las personas que se molestan por estas cosas están desperdiciando recursos y creando un mal ambiente.
Jim Balter
@JimBalter "No competentes" - ¡ja! "Casi ningún idioma requiere eso", por eso dije "convención". Si es idiota, se llama "idiota". "No hay returnfunción": el hecho de que el intérprete le prohíba registrar una función con nombre returnno ayudará al lector del código a no cuestionar su cordura primero, por lo que este código es un desperdicio. return(1)no es sólo una "mala práctica", es una señal peligrosa de que alguien no sabe lo que está haciendo.
hijarian
2
Entonces, o no sabes lo que significa "obligado", o estás cambiando tu reclamo ... de cualquier manera, no perderé más tiempo contigo.
Jim Balter
Dudo de la verdad de tu última frase; returntiene (en todos los idiomas que sé que tienen esta palabra clave) menor precedencia. Entonces, si la expresión opcional está presente, siempre se evalúa primero.
Wolf
4

En la declaración de retorno, los paréntesis alrededor de la expresión ya están integrados.

En JavaScript, como en muchos otros lenguajes (como C, C ++, Java, Python), la declaración de retorno tiene dos partes: la palabra clave returny una expresión (opcional). Entonces, en cualquier caso, todo lo que sigue a la returnpalabra clave se evalúa primero como una expresión , después de eso, la declaración de retorno se "ejecuta" pasando el control de vuelta al llamador.

Usar o no usar paréntesis es una cuestión de estilo , mientras que la mayoría de las guías de estilo los prohíben para casos triviales como el citado en su pregunta, porque hace que el retorno parezca falsamente una función.

Apéndice posterior

Si tiene paréntesis o no, nunca olvide colocar la expresión opcional detrás de return, es decir, en la misma línea. El verdadero problema con returnJavaScript radica en agregar un salto de línea después:

function test() {
  return 
  1;
}

... porque la testfunción anterior volverá undefined.

Lobo
fuente
1

al agregar paréntesis, nos aseguramos de que javascript no inserte un punto y coma antes de varias declaraciones escritas después del retorno, como referencia: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

ejemplo :

return a + b;

se transforma en

return; a + b;

por ASI.

La consola advertirá "código inalcanzable después de la declaración de retorno". Para evitar este problema (para prevenir ASI), puede usar paréntesis:

return ( a + b );
código copiado de: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

Rahul Singh Bhadhoriya
fuente
Esto es absolutamente correcto y de esa manera tiene sentido para expresiones complejas. Pero debe agregar en la misma línea o directamente detrás de return en la primera oración para que quede aún más claro. Creo que el voto negativo proviene de una mala interpretación de esto.
Wolf