JavaScriptで 2つの値を返そうとしています。これは可能ですか?
var newCodes = function() {
var dCodes = fg.codecsCodes.rs;
var dCodes2 = fg.codecsCodes2.rs;
return dCodes, dCodes2;
};
JavaScriptで 2つの値を返そうとしています。これは可能ですか?
var newCodes = function() {
var dCodes = fg.codecsCodes.rs;
var dCodes2 = fg.codecsCodes2.rs;
return dCodes, dCodes2;
};
回答:
いいえ。ただし、値を含む配列を返すことができます。
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にコンパイルできます。
return {dCodes : dCodes, dCodes2 : dCodes2};
ます。参照しやすくするためです。
const { dCodes, dCodes2 } = newCodes();
return {dCodes, dCodes2}
は、前述の@Intelekshualとまったく同じように機能し、(2)同じ関数を使用して、配列を破壊することで簡単にアクセスできます[dCodes, dCodes2] = newCodes()
(3)オブジェクト({dCodes, dCodes2} = newCodes())
(そこで宣言を使用する必要はありません@Taylorただし、a var
は現在のSashaの例により適しています)。
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, ...
。実際に起こることは、見た目ではありません。return文の式は- 1, 2, 3
-何もなく、コンマ演算子は(数値リテラルに適用されていない1
、2
と3
-最終的にはその最後の式の値に評価され、順次)3
。そのためreturn 1, 2, 3
、機能的にはと同じですreturn 3
。
return 1, 2, 3;
// becomes
return 2, 3;
// becomes
return 3;
function foo(){return 1,2,3;}
実行中のconsole.log([].push(foo()))
出力1.
オブジェクトリテラルを返すだけです
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);
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()
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でそれを試すことができます!
新しく導入された(ES6)構文についてもう1つ言及する価値があるのは、割り当てを破棄することに加えて、オブジェクト作成の省略表現を使用することです。
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ポリフィラーでポリフィルすることができますが、幸いなことに、最近のバージョンのChromeおよびFirefoxでネイティブに動作します。
しかし、新しいオブジェクトを作成するとき、メモリ割り当て(および最終的なGC負荷)がここに含まれるので、そこから多くのパフォーマンスを期待しないでください。JavaScriptは、とにかく非常に最適なものを開発するのに最適な言語ではありませんが、それが必要な場合は、JavaScript、Java、および他の言語間で通常一般的なパフォーマンストリックである周囲のオブジェクトまたはそのような手法に結果を置くことを検討できます。
これのための最良の方法は
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}
}
他の人が推奨しているように配列またはオブジェクトを返す以外に、コレクター関数を使用することもできます(The Little Schemerにあるものと同様)。
function a(collector){
collector(12,13);
}
var x,y;
a(function(a,b){
x=a;
y=b;
});
私はjsperfテストを行って、3つの方法のうちどれが速いかを確認しました。アレイが最も速く、コレクターが最も遅い。
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);
};
:)
バム!これは単に問題を解決する別の方法です。
欠落している重要な部分を追加して、この質問を完全なリソースにします。これは検索結果に表示されるためです。
オブジェクトの破壊
オブジェクトの構造化では、必ずしも変数名と同じキー値を使用する必要はありません。次のように定義することで、異なる変数名を割り当てることができます。
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
ます。
これがこの質問にいくつかの価値を追加することを願っています:)
JavaScriptで複数の値を返す非常に一般的な方法は、次のようなオブジェクトリテラルを使用することです。
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
「オブジェクト」を使用できます
function newCodes(){
var obj= new Object();
obj.dCodes = fg.codecsCodes.rs;
obj.dCodes2 = fg.codecsCodes2.rs;
return obj;
}
最新の破壊割り当てを使用することをお勧めします(ただし、環境でサポートされていることを確認してください)
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>
数日前、私が作成した関数から複数の戻り値を取得するという同様の要件がありました。
多くの戻り値から、特定の条件の特定の値のみを返し、次に他の条件に対応する他の戻り値を返す必要がありました。
これが私がそれをした方法の例です:
関数:
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;
この質問に答える全体のポイントは、日付を適切な形式で取得するこのアプローチを共有することです。それがあなたのお役に立てば幸いです:)