在JavaScript中返回多个值?

我试图在JavaScript中返回两个值。这可能吗?

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

不能,但是你可以返回一个包含你的值的数组:

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

*参见this table for浏览器兼容性。基本上,除了IE之外的所有现代浏览器都支持这种语法,但是您可以在构建时使用巴别塔< / >。

只返回一个对象文字

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

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

你可以从ECMAScript 6开始使用数组和“解构assignments"。请注意,这些在旧的Javascript版本中是不可用的(也就是说,ECMAScript第三版和第五版都不可用)。

它允许你同时赋值给1+个变量:

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

你也可以使用结合属性值简写的对象解构来命名一个对象的返回值,并挑出你想要的:

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

顺便说一下,不要被ECMAScript允许您return 1, 2, ...的事实所愚弄。那里真正发生的不是表面上看起来的那样。return语句中的表达式1, 2, 3只是一个逗号运算符,它依次应用于数值字面值(123),最终计算为它的最后一个表达式3的值。这就是为什么第6条在功能上与第7条完全相同。

return 1, 2, 3;// becomesreturn 2, 3;// becomesreturn 3;

Ecmascript 6包括“解构赋值”(正如kangax提到的),因此在所有浏览器(不仅仅是Firefox)中,您将能够捕获值的数组,而不必为捕获它们的唯一目的而创建命名数组或对象。

//so to capture from this functionfunction 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 thisvar 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中尝试了!

除了像其他人推荐的那样返回一个数组或对象,你还可以使用一个收集器函数(类似于小策划者中发现的那个):

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

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

然后使用

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

新版本:

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

你还可以:

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

另一个值得一提的是新引入的(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和其他语言之间常见的性能技巧。

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

:)

砰!这只是解决问题的另一种方法。

你可以使用Object

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

都是正确的。return逻辑上从左到右处理并返回最后一个值。

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

从ES6开始,你可以这样做

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

返回表达式{dCodes, dCodes2}属性值简写,等价于这个{dCodes: dCodes, dCodes2: dCodes2}

最后一行的作业叫做对象解构赋值。它提取对象的属性值并将其赋值给同名变量。如果你想把返回值赋给不同名称的变量,你可以这样做let {dCodes: x, dCodes2: y} = newCodes()

几天前,我有类似的要求,从我创建的函数中获得多个返回值。

从许多返回值,我需要它只返回特定的值为一个给定的条件,然后其他返回值对应于其他条件。


以下是我如何做到这一点的例子:

功能:

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的方法。希望对你有所帮助:)

我建议使用最新的解构的任务(但是确保您的环境支持它)

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

我并不是在这里添加新内容,而是另一种替代方法。

 var newCodes = function() {var dCodes = fg.codecsCodes.rs;var dCodes2 = fg.codecsCodes2.rs;let [...val] = [dCodes,dCodes2];return [...val];};
我知道有两种方法:1. 返回为数组2. 返回为Object

下面是我找到的一个例子:

<script>// Defining functionfunction divideNumbers(dividend, divisor){var quotient = dividend / divisor;var arr = [dividend, divisor, quotient];return arr;}
// Store returned value in a variablevar all = divideNumbers(10, 2);
// Displaying individual valuesalert(all[0]); // 0utputs: 10alert(all[1]); // 0utputs: 2alert(all[2]); // 0utputs: 5</script>


<script>// Defining functionfunction divideNumbers(dividend, divisor){var quotient = dividend / divisor;var obj = {dividend: dividend,divisor: divisor,quotient: quotient};return obj;}
// Store returned value in a variablevar all = divideNumbers(10, 2);
// Displaying individual valuesalert(all.dividend); // 0utputs: 10alert(all.divisor); // 0utputs: 2alert(all.quotient); // 0utputs: 5</script>

添加缺失的重要部分,使这个问题成为一个完整的资源,因为它会在搜索结果中出现。

对象解构

在对象解构中,你不一定需要使用与你的变量名相同的键值,你可以通过定义一个不同的变量名,如下所示:

const newCodes = () => {let dCodes = fg.codecsCodes.rs;let dCodes2 = fg.codecsCodes2.rs;return { dCodes, dCodes2 };};
//destructuringlet { dCodes: code1, dCodes2: code2 } = newCodes();
//now it can be accessed by code1 & code2console.log(code1, code2);

数组解构

在数组解构中,可以跳过不需要的值。

const newCodes = () => {//...return [ dCodes, dCodes2, dCodes3 ];};
let [ code1, code2 ] = newCodes(); //first two itemslet [ code1, ,code3 ] = newCodes(); //skip middle item, get first & lastlet [ ,, code3 ] = newCodes(); //skip first two items, get lastlet [ code1, ...rest ] = newCodes(); //first item, and others as an array

值得注意的是,...rest应该始终位于末尾,因为在所有其他内容都聚合到rest之后销毁任何内容没有任何意义。

我希望这将为这个问题增加一些价值:)

我们做不到你想做的事。但可能低于这个水平的事情是可以做到的。

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

然后在调用方法时

const {x,y} = multiReturnValues();
console.log(x) ---> 10console.log(y) ---> 20

javascript中返回多个值的常见方法是使用对象字面量,如下所示:

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

然后得到这样的值:

myFunction().firstName; //AlirezamyFunction().familyName; //DezfoolianmyFunction().age; //age

或者更短的方式:

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

把它们分开,比如:

firstName; //AlirezafamilyName; //Dezfoolianage; //35

使用模板字面量' ${}'可以返回一个包含许多值和变量的字符串

如:

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

它既简短又简单。