JavaScript에서 여러 값을 반환 하시겠습니까?


844

JavaScript 에서 두 개의 값을 반환하려고합니다 . 이것이 가능한가?

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

콜백을 사용하여이 문제를 해결할 수 있습니다. 기꺼이 원하면 내 답변을 참조하십시오. 사람들은 튜플을 사용하거나 콜백을 사용하여 JS로 쉽게 "여러 값을 반환"할 수 있다는 것을 잊습니다!
Alexander Mills

16
답변이 구식입니다. 이제 가능합니다. 2ality.com/2014/06/es6-multiple-return-values.html
Erel Segal-Halevi

3
기술적으로 여전히 단일 객체 / 배열을 반환합니다. ES6에서 더 간단한 해체 일뿐입니다.
Andrea Bergonzo

답변:


1295

아니요,하지만 값이 포함 된 배열을 반환 할 수 있습니다.

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를 제외한 모든 최신 브라우저는이 구문을 지원하지만 빌드시 Babel 과 같은 도구를 사용하여 ES6 코드를 IE 호환 JavaScript로 컴파일 할 수 있습니다 .


151
또는 return {dCodes : dCodes, dCodes2 : dCodes2};참조하기 쉽도록 객체를 반환 할 수 있습니다 .
Intelekshual

10
기능적으로 동일한 객체 {: dCodes : dCodes2 : dCodes2 : dCodes2}를 반환 할 수도 있지만 반환 된 객체를 참조하면 obj.dCodes 및 obj.dCodes2 vs obj [0] 및 obj [1 ]
Jonathan S.

1
@alexela 물론 var dCodes = newCodes (). dCodes; var dCodes2 = newCodes (). dCodes2 그러나 함수가 복잡한 경우 리소스를 낭비 할 수있는 함수를 두 번 호출합니다.
Vadim Kirilchuk

12
@VadimKirilchuk 파괴적인 할당으로 두 번 호출 할 필요가 없습니다 – 예. const { dCodes, dCodes2 } = newCodes();
Taylor Edmiston

7
다른 답변이 말하고 암시하는 것처럼 ES6에는 몇 가지 옵션이 있습니다. 3 : 정확히 말하면 : (1) @Intelekshual과 동일한 객체 속성 속기 return {dCodes, dCodes2} 및 (2) 동일한 기능을 사용하여 배열을 파괴 [dCodes, dCodes2] = newCodes()하거나 (3) 객체 ({dCodes, dCodes2} = newCodes())(@Taylor에서 선언을 사용할 필요가 없음 )로 간단히 액세스 할 수 있습니다 A는 비록 var것보다) 현재 사샤의 예를 들어 피팅.
cregox

241

"destructuring assignments"를 사용하여 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;

1
마지막 예에 대한 신기하고 흥미로운 점 : 출력물 function foo(){return 1,2,3;}console.log([].push(foo()))인쇄하려면 1.
Meredith

@ AurélienOoms 나중에 깨달았습니다. 감사합니다
Meredith

1
왜 var [x, y] = [1, 2]; 엑스; // 1 y; // 2 크롬에서 작동하지 않습니까? 오류를 제기; ReferenceError : 할당시 잘못된 왼쪽
Naveen Agarwal

1
Chrome v49는 1 주일 전에 '지정 파괴'를 지원하여 출시되었습니다.
Eugene Kulabuhov

1
이것은 받아 들일만한 대답이어야합니다-새로운 구조 조정은 이것을하는 좋은 방법입니다.
Jez

68

그냥 객체 리터럴을 반환

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

@SeanKinsey이 솔루션이 마음에 듭니다. 나에게 유용 할 수 있습니다. 한 가지 질문은, 결과의 모든 인스턴스 ( result1 .. resultN )가 함수의 자체 사본을 얻거나 함수 코드를 재사용 할 수 있도록 리턴에 함수가 필요한가? (내가 이것을 어떻게 테스트 할 수 있는지 모르겠다.) TIA.
Karl

44

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


27

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에서 사용해 볼 수 있습니다!


24

새로 도입 된 (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 및 다른 언어 간의 일반적인 성능 트릭 인 기술에 결과를 적용하는 것을 고려할 수 있습니다.


그것은 IE 또는 Edge에서 아직 작동하지 않고 있습니다.
user1133275

이것을 꽤 많이 사용했습니다 ... @ user3015682에 표시된 것처럼 배열을 사용하고 가능하면 객체를 생성하지 않는 것이 더 빠르거나 느립니다.
dkloke

18

가장 좋은 방법은

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}
}

그런 다음 각 변수에 대해 함수를 다시 실행 하시겠습니까? 최선의 방법은 아닙니다.
Elia Iliashenko

이 함수는 다중 값을 반환하며 아마도 가장 좋은 방법은 아닙니다.
Behnam Mohammadi

인터프리터가 a ()를 만날 때마다 함수를 다시 실행합니다. 따라서 var f = a (). f; var c = a (). c; var d = a (). d; 성능 저하가 발생하기 쉬운 a ()를 세 번 시작합니다. 더 나은 방법은 var result = a ();입니다. var f = 결과 .f; 등
엘리아 Iliashenko

1
성능 향상을 위해 값을 변수에 유지하고 사용할 수 있습니다 (예 : var result = a (); result.d 또는 result.c 및 result.f 값을 사용하므로 한 번에 a () 함수를 실행하십시오.
Behnam Mohammadi

9

다른 사람들이 권장 한대로 배열이나 객체를 반환하는 것 외에도 콜렉터 함수 ( 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


일반적 collector이라고 continuation하고 기술이라고 CPS
ceving

7

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

:)

bam! 이것은 단순히 문제를 해결하는 또 다른 방법입니다.


6

누락 된 중요한 부분을 추가하여이 질문을 완전한 리소스로 만들면 검색 결과에 나타납니다.

객체 파괴

객체 파괴에서 변수 이름과 동일한 키 값을 반드시 사용할 필요는 없으며, 아래와 같이 정의하여 다른 변수 이름을 지정할 수 있습니다.

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

//destructuring
let { dCodes: code1, dCodes2: code2 } = newCodes();

//now it can be accessed by code1 & code2
console.log(code1, code2);

배열 파괴

배열 파괴에서는 필요하지 않은 값을 건너 뛸 수 있습니다.

const newCodes = () => {  
    //...
    return [ dCodes, dCodes2, dCodes3 ];
};

let [ code1, code2 ] = newCodes(); //first two items
let [ code1, ,code3 ] = newCodes(); //skip middle item, get first & last
let [ ,, code3 ] = newCodes(); //skip first two items, get last
let [ code1, ...rest ] = newCodes(); //first item, and others as an array

...rest다른 모든 것이 집계 된 후에는 무언가를 파괴하는 것이 이치에 맞지 않기 때문에 항상 끝에 있어야한다는 점에 주목할 가치가 있습니다 rest.

이것이 이것이이 질문에 가치를 더하기를 바랍니다 :)


5

당신은 또한 할 수 있습니다 :

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

const {d,c,f} = a()

5

자바 스크립트에서 여러 값반환 하는 가장 일반적인 방법 은 객체 리터럴을 사용하는 것입니다.

const myFunction = () => {
  const firstName = "Alireza", 
        familyName = "Dezfoolian",
        age = 35;
  return { firstName, familyName, age};
}

다음과 같은 값을 얻으십시오.

myFunction().firstName; //Alireza
myFunction().familyName; //Dezfoolian
myFunction().age; //age

또는 더 짧은 방법 :

const {firstName, familyName, age} = myFunction();

다음과 같이 개별적으로 가져옵니다.

firstName; //Alireza
familyName; //Dezfoolian
age; //35

4

"개체"를 사용할 수 있습니다

function newCodes(){
    var obj= new Object();
    obj.dCodes = fg.codecsCodes.rs;
    obj.dCodes2 = fg.codecsCodes2.rs;

    return obj;
}

1
이것이 IE를위한 길입니다. 나중에 다음과 같이 사용하십시오 : let obj = newCodes (); alert (obj.dCodes);
Asen Kasimov

3

모두 맞습니다. return논리적으로 왼쪽에서 오른쪽으로 처리하고 마지막 값을 반환합니다.

function foo(){
    return 1,2,3;
}

>> foo()
>> 3

1
,조작자이며 어떠한 식으로 이용 될 수있다. 여기에는 특별한 것이 없습니다 return.
gman

3

최신 파괴 과제 를 사용하는 것이 좋습니다 (그러나 환경에서 지원되는지 확인하십시오 )

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

2

이 작업을 수행하는 두 가지 방법을 알고 있습니다. 1. 배열로 반환 2. 개체로 반환

내가 찾은 예는 다음과 같습니다.

<script>
// Defining function
function divideNumbers(dividend, divisor){
    var quotient = dividend / divisor;
    var arr = [dividend, divisor, quotient];
    return arr;
}

// Store returned value in a variable
var all = divideNumbers(10, 2);

// Displaying individual values
alert(all[0]); // 0utputs: 10
alert(all[1]); // 0utputs: 2
alert(all[2]); // 0utputs: 5
</script>



<script>
// Defining function
function divideNumbers(dividend, divisor){
    var quotient = dividend / divisor;
    var obj = {
        dividend: dividend,
        divisor: divisor,
        quotient: quotient
    };
    return obj;
}

// Store returned value in a variable
var all = divideNumbers(10, 2);

// Displaying individual values
alert(all.dividend); // 0utputs: 10
alert(all.divisor); // 0utputs: 2
alert(all.quotient); // 0utputs: 5
</script>

1

며칠 전 필자가 만든 함수에서 여러 반환 값을 가져와야하는 비슷한 요구 사항이있었습니다.

많은 반환 값에서 주어진 조건에 대한 특정 값만 반환 한 다음 다른 조건에 해당하는 다른 반환 값을 반환해야했습니다.


내가 한 일의 예는 다음과 같습니다.

함수:

function myTodayDate(){
    var today = new Date();
    var day = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];
    var month = ["January","February","March","April","May","June","July","August","September","October","November","December"];
    var myTodayObj = 
    {
        myDate : today.getDate(),
        myDay : day[today.getDay()],
        myMonth : month[today.getMonth()],
        year : today.getFullYear()
    }
    return myTodayObj;
}

함수가 리턴 한 오브젝트에서 필수 리턴 값 가져 오기 :

var todayDate = myTodayDate().myDate;
var todayDay = myTodayDate().myDay;
var todayMonth = myTodayDate().myMonth;
var todayYear = myTodayDate().year;

이 질문에 대한 대답의 요점은 Date를 좋은 형식으로 얻는이 접근법을 공유하는 것입니다. 그것이 당신을 도왔기를 바랍니다 :)


1

나는 여기에 새로운 것을 추가하는 것이 아니라 다른 대체 방법입니다.

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

0

글쎄, 우리는 정확히 당신의 노력을 할 수 없습니다. 그러나 아래에 가능한 일이 있습니다.

function multiReturnValues(){
    return {x:10,y:20};
}

그런 다음 메소드를 호출 할 때

const {x,y} = multiReturnValues();

console.log(x) ---> 10
console.log(y) ---> 20
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.