Pregunta Devuelve varios valores en JavaScript?


Estoy tratando de devolver dos valores en JavaScript. ¿Es eso posible?

var newCodes = function() {  
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    return dCodes, dCodes2;
};

561
2018-05-26 22:06


origen


Respuestas:


No, pero podría devolver una matriz que contenga sus valores:

var newCodes = function() {
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    return [dCodes, dCodes2];
};

Entonces puedes acceder a ellos de la siguiente manera:

var codes = newCodes();
var dCodes = codes[0];
var dCodes2 = codes[1];

Si desea colocar "etiquetas" en cada uno de los valores devueltos (más fácil de mantener), puede devolver un objeto:

var newCodes = function() {
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    return {
        dCodes: dCodes,
        dCodes2: dCodes2
    };
};

Y para acceder a ellos:

var codes = newCodes();
var dCodes = codes.dCodes;
var dCodes2 = codes.dCodes2;

905
2018-05-26 22:09



Puede hacer esto desde Javascript 1.7 en adelante usando "asignaciones desestructuradoras". Tenga en cuenta que estos no están disponibles en versiones anteriores de Javascript (lo que significa, ni con ECMAScript tercera ni la quinta edición).

Le permite asignar a variables 1+ simultáneamente:

var [x, y] = [1, 2];
x; // 1
y; // 2

// or

[x, y] = (function(){ return [3, 4]; })();
x; // 3
y; // 4

También puedes usar desestructuración de objetos combinado con taquigrafía de valor de propiedad para nombrar los valores devueltos en un objeto y seleccionar los que desee:

let {baz, foo} = (function(){ return {foo: 3, bar: 500, baz: 40} })();
baz; // 40
foo; // 3

Y, por cierto, no se deje engañar por el hecho de que ECMAScript le permite return 1, 2, .... Lo que realmente sucede allí no es lo que parece. Una expresión en declaración de devolución - 1, 2, 3 - no es más que un operador de coma aplicado a literales numéricos (1 , 2y 3) secuencialmente, que finalmente evalúa el valor de su última expresión - 3. Es por eso return 1, 2, 3 es funcionalmente idéntico a nada más, pero return 3.

return 1, 2, 3;
// becomes
return 2, 3;
// becomes
return 3;

146
2018-05-26 23:09



Solo devuelve un objeto literal

function newCodes(){
    var dCodes = fg.codecsCodes.rs; // Linked ICDs  
    var dCodes2 = fg.codecsCodes2.rs; //Linked CPTs       
    return {
        dCodes: dCodes, 
        dCodes2: dCodes2
    };  
}


var result = newCodes();
alert(result.dCodes);
alert(result.dCodes2);

52
2018-05-26 22:11



Ecmascript 6 incluye "asignaciones de desestructuración" (como se menciona en kangax), por lo que en todos los navegadores (no solo Firefox) podrá capturar una matriz de valores sin tener que crear una matriz o un objeto con el único propósito de capturarlos.

//so to capture from this function
function myfunction()
{
 var n=0;var s=1;var w=2;var e=3;
 return [n,s,w,e];
}

//instead of having to make a named array or object like this
var IexistJusttoCapture = new Array();
IexistJusttoCapture = myfunction();
north=IexistJusttoCapture[0];
south=IexistJusttoCapture[1];
west=IexistJusttoCapture[2];
east=IexistJusttoCapture[3];

//you'll be able to just do this
[north, south, west, east] = myfunction(); 

¡Ya puedes probarlo en Firefox!


23
2017-12-10 06:51



Otro valor para mencionar la sintaxis recientemente introducida (ES6) es el uso de la taquigrafía de creación de objetos además de la asignación de destrucción.

function fun1() {
  var x = 'a';
  var y = 'b';
  return { x, y, z: 'c' };
  // literally means { x: x, y: y, z: 'c' };
}

var { z, x, y } = fun1(); // order or full presence is not really important
// literally means var r = fun1(), x = r.x, y = r.y, z = r.z;
console.log(x, y, z);

Esta sintaxis se puede rellenar con Babel u otro jas polyfiller para navegadores más antiguos, pero afortunadamente ahora funciona de forma nativa con las versiones recientes de Chrome y Firefox.

Pero como hacer un nuevo objeto, la asignación de memoria (y eventual carga de gc) están involucradas aquí, no esperes mucho rendimiento de ella. JavaScript no es el mejor lenguaje para desarrollar cosas altamente óptimas de todos modos, pero si eso es necesario, puede considerar poner su resultado en un objeto circundante o técnicas que normalmente son trucos de rendimiento comunes entre JavaScript, Java y otros lenguajes.


19
2017-10-01 07:12



La mejor manera para esto es

function a(){
     var d=2;
     var c=3;
     var f=4;
     return {d:d,c:c,f:f}
}

Entonces usa

a().f

regreso 4

en ES6 puedes usar este código

function a(){
      var d=2;
      var c=3;
      var f=4;
      return {d,c,f}
}

15
2017-09-08 08:38



Desde ES6 puedes hacer esto

let newCodes = function() {  
    const dCodes = fg.codecsCodes.rs
    const dCodes2 = fg.codecsCodes2.rs
    return {dCodes, dCodes2}
};

let {dCodes, dCodes2} = newCodes()

Expresión de retorno {dCodes, dCodes2} es taquigrafía de valor y es equivalente a esto {dCodes: dCodes, dCodes2: dCodes2}.

Esta asignación en la última línea se llama asignación de destrucción de objetos. Extrae el valor de propiedad de un objeto y lo asigna a la variable del mismo nombre. Si desea asignar valores devueltos a variables de diferente nombre, puede hacerlo así let {dCodes: x, dCodes2: y} = newCodes()


12
2018-03-01 13:59



Además de devolver una matriz o un objeto como otros recomendaron, también puede usar una función de recopilación (similar a la que se encuentra en El pequeño Schemer)

function a(collector){
  collector(12,13);
}

var x,y;
a(function(a,b){
  x=a;
  y=b;
});

Hice una prueba jsperf para ver cuál de los tres métodos es más rápido. La matriz es más rápida y el colector más lento.

http://jsperf.com/returning-multiple-values-2


6
2017-08-24 17:15