Возврат нескольких значений в JavaScript?
Я пытаюсь вернуть два значения в JavaScript. Это возможно?
var newCodes = function() {
var dCodes = fg.codecsCodes.rs;
var dCodes2 = fg.codecsCodes2.rs;
return dCodes, dCodes2;
};
В приведенном примере кода я использую запятую для возврата двух значений, но это, похоже, не работает так, как я надеялся. Как правильно вернуть оба значения из функции?
5 ответ(ов)
В ответ на ваш вопрос, вы можете просто вернуть объектный литерал в вашем коде. Вот пример, как это можно сделать:
function newCodes() {
var dCodes = fg.codecsCodes.rs; // Связанные ICD
var dCodes2 = fg.codecsCodes2.rs; // Связанные CPT
return { dCodes, dCodes2 };
}
var result = newCodes();
alert(result.dCodes);
alert(result.dCodes2);
В этом примере функция newCodes
возвращает объект, содержащий свойства dCodes
и dCodes2
. Вы можете получить доступ к этим свойствам, как показано в последующих строках, с помощью объекта result
.
С тех пор как в JavaScript был введён стандарт 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()
.
Таким образом, x
будет иметь значение свойства dCodes
, а y
— значение свойства dCodes2
.
Ecmascript 6 включает в себя "деструктуризацию" (как упомянул kangax), что позволяет вам извлекать значения из массива без необходимости создавать именованный массив или объект только для этой цели.
Вот пример:
// Для захвата значений из этой функции
function myfunction() {
var n = 0;
var s = 1;
var w = 2;
var e = 3;
return [n, s, w, e];
}
// Вместо необходимости создавать именованный массив или объект, например так
var IexistJusttoCapture = new Array();
IexistJusttoCapture = myfunction();
north = IexistJusttoCapture[0];
south = IexistJusttoCapture[1];
west = IexistJusttoCapture[2];
east = IexistJusttoCapture[3];
// Вы сможете сделать это
[north, south, west, east] = myfunction();
Вы можете попробовать это уже в Firefox! Теперь вы можете легко извлекать значения напрямую, что упрощает код и делает его более читаемым.
Новый синтаксис, введенный в ES6, который стоит упомянуть, — это использование сокращенного синтаксиса для создания объектов в дополнение к деструктурирующему присваиванию.
function fun1() {
var x = 'a';
var y = 'b';
return { x, y, z: 'c' };
// по сути это то же самое, что и { x: x, y: y, z: 'c' };
}
var { z, x, y } = fun1(); // порядок или полное присутствие не столь важны
// фактически это эквивалентно var r = fun1(), x = r.x, y = r.y, z = r.z;
console.log(x, y, z);
Этот синтаксис можно использовать в старых браузерах с помощью полифилов, таких как Babel, но, к счастью, он уже работает нативно в последних версиях Chrome и Firefox.
Однако имейте в виду, что при создании нового объекта здесь происходит выделение памяти (а также возможная нагрузка на сборщик мусора), поэтому не стоит ожидать высокой производительности от этого метода. В общем, JavaScript не является лучшим языком для разработки высоко оптимизированных решений, но если это необходимо, можно рассмотреть возможность размещения результата в окружающем объекте или использование других техник, которые обычно распространены как трюки для повышения производительности в JavaScript, Java и других языках.
В вашем коде вы использовали два различных способа объявления объекта с использованием идентификаторов. Давайте разберем и переведем это на русский язык в стиле ответа на StackOverflow.
В первом варианте функции a()
вы создаете переменные d
, c
, и f
, а затем возвращаете объект, где свойства явно указаны:
function a(){
var d = 2;
var c = 3;
var f = 4;
return {d: d, c: c, f: f};
}
Здесь мы создаем объект с помощью синтаксиса d: d
, который задает свойству d
значение переменной d
. То же самое происходит и с c
и f
.
Затем вы можете деструктурировать этот объект, чтобы получить значения переменных:
const {d, c, f} = a();
Во втором варианте кода можно упростить синтаксис возвращаемого объекта, просто указав переменные без явного указания имен свойств, так как они совпадают с названиями переменных:
function a(){
var d = 2;
var c = 3;
var f = 4;
return {d, c, f}; // Здесь можно опустить повторы
}
Этот способ более лаконичный и читабельный, так как вы избавляетесь от повторения имен переменных. На выходе вы получаете тот же самый результат, и деструктуризация по-прежнему работает так же:
const {d, c, f} = a();
Таким образом, новый синтаксис является более современным и предпочтительным с точки зрения удобства и чистоты кода.
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"