Вернуть несколько значений в JavaScript? - PullRequest
697 голосов
/ 27 мая 2010

Я пытаюсь вернуть два значения в JavaScript. Это возможно?

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

Ответы [ 18 ]

1062 голосов
/ 27 мая 2010

Нет, но вы можете вернуть массив, содержащий ваши значения:

function getValues() {
    return [getFirstValue(), getSecondValue()];
}

Тогда вы можете получить к ним доступ так:

var values = getValues();
var first = values[0];
var second = values[1];

С последним синтаксисом ECMAScript 6 * вы также можете интуитивно деструктурировать возвращаемое значение:

const [first, second] = getValues();

Если вы хотите поместить «метки» в каждое возвращаемое значение (проще в обслуживании), вы можете вернуть объект:

function getValues() {
    return {
        first: getFirstValue(),
        second: getSecondValue(),
    };
}

И для доступа к ним:

var values = getValues();
var first = values.first;
var second = values.second;

Или с синтаксисом ES6:

const {first, second} = getValues();

* См. в этой таблице для совместимости браузера. По сути, все современные браузеры, кроме IE, поддерживают этот синтаксис, но вы можете скомпилировать код ES6 до IE-совместимого JavaScript во время сборки с помощью таких инструментов, как Babel .

216 голосов
/ 27 мая 2010

Вы можете сделать это начиная с Javascript 1.7, используя «деструктурирующие назначения» . Обратите внимание, что они недоступны в более старых версиях Javascript (т.е. ни в ECMAScript 3-й, ни в 5-й редакции).

Позволяет одновременно назначать 1+ переменных:

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

// or

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

Вы также можете использовать деструктуризацию объекта в сочетании с сокращением значения свойства , чтобы назвать возвращаемые значения в объекте и выбрать те, которые вам нужны:

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

И, кстати, не обманывайте себя тем фактом, что ECMAScript позволяет вам return 1, 2, .... То, что действительно происходит там, не то, что может показаться. Выражение в выражении возврата - 1, 2, 3 - это не что иное, как оператор запятой, применяемый к числовым литералам (1, 2 и 3) последовательно, что в итоге приводит к значению его последнего выражения - 3 , Вот почему return 1, 2, 3 функционально идентичен не более чем return 3.

return 1, 2, 3;
// becomes
return 2, 3;
// becomes
return 3;
61 голосов
/ 27 мая 2010

Просто верните литерал объекта

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);
33 голосов
/ 01 марта 2018

Начиная с ES6 вы можете сделать это

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

let {dCodes, dCodes2} = newCodes()

Возвращаемое выражение {dCodes, dCodes2} является сокращенным значением свойства и эквивалентно этому {dCodes: dCodes, dCodes2: dCodes2}.

Это назначение в последней строке называется объект, разрушающий назначение . Он извлекает значение свойства объекта и присваивает его переменной с тем же именем. Если вы хотите присвоить возвращаемые значения переменным с другим именем, вы можете сделать это следующим образом let {dCodes: x, dCodes2: y} = newCodes()

24 голосов
/ 10 декабря 2013

Ecmascript 6 включает «деструктурирующие назначения» (как упоминалось в kangax), поэтому во всех браузерах (не только в Firefox) вы сможете захватывать массив значений без необходимости создания именованного массива или объекта для единственной цели захватаих.

//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(); 

Вы уже можете попробовать это в Firefox!

21 голосов
/ 01 октября 2016

Стоит также упомянуть недавно введенный (ES6) синтаксис - использование сокращения объекта в дополнение к разрушающему присваиванию.

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);

Этот синтаксис может быть заполнен с помощью babel или другого js polyfiller для более старых браузеров, но, к счастью, теперь работает непосредственно с последними версиями Chrome и Firefox.

Но поскольку создание нового объекта связано с выделением памяти (и возможной загрузкой gc), не ожидайте от него большой производительности. JavaScript в любом случае не является лучшим языком для разработки высокооптимальных вещей, но если это необходимо, вы можете подумать о том, чтобы поместить свой результат в окружающий объект или в такие методы, которые обычно являются обычными приемами повышения производительности между JavaScript, Java и другими языками.

15 голосов
/ 08 сентября 2014

Лучший способ для этого -

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

Тогда используйте

a().f

возврат 4

в ES6 вы можете использовать этот код

function a(){
      var d=2;
      var c=3;
      var f=4;
      return {d,c,f}
}
7 голосов
/ 24 августа 2014

Кроме возврата массива или объекта, как рекомендовали другие, вы также можете использовать функцию-сборщик (аналогичную той, что есть в The Little Schemer ):

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

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

Я сделал тест jsperf, чтобы увидеть, какой из трех методов быстрее. Массив самый быстрый, а коллектор самый медленный.

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

5 голосов
/ 27 января 2017

В JS мы можем легко вернуть кортеж с массивом или объектом, но не забывайте! => JS является callback ориентированным языком, и здесь есть небольшой секрет для «возврата нескольких значений», о котором еще никто не упоминал, попробуйте это:

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

становится

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

:)

бац! Это просто еще один способ решения вашей проблемы.

3 голосов
/ 05 июня 2016

Вы также можете сделать:

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

const {d,c,f} = a()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...