在 JavaScript 中返回多个值?

IT技术 javascript return multiple-variable-return
2021-01-29 23:49:41

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

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

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

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};以使其更易于引用。
2021-03-15 23:49:41
正如其他答案所说(和暗示的评论),ES6 在这里带来了一些选择。3 确切地说:(1)对象属性速记的 return {dCodes, dCodes2}工作方式与提到的@Intelekshual 一样,(2)使用相同的函数,您可以简单地使用解构数组[dCodes, dCodes2] = newCodes()或(3)对象访问它们({dCodes, dCodes2} = newCodes())(无需在那里使用声明@Taylor ,尽管 avar更适合当前 Sasha 的示例)。
2021-03-19 23:49:41
您甚至可能会返回一个对象 {:dCodes: dCodes, dCodes2: dCodes2} 功能相同,但是当您引用返回的对象时,您的代码可读性更强,例如 obj.dCodes 和 obj.dCodes2 vs obj[0] 和 obj[1 ]
2021-03-20 23:49:41
@VadimKirilchuk 无需使用解构赋值调用它两次- 例如。const { dCodes, dCodes2 } = newCodes();
2021-04-04 23:49:41
@alexela 当然你可以简单地使用 var dCodes = newCodes().dCodes; var dCodes2 = newCodes().dCodes2 但是,您将调用该函数两次,如果它很复杂,可能会浪费资源。
2021-04-07 23:49:41

从 ECMAScript 6 开始,您可以使用数组和“解构赋值”来做到这一点请注意,这些在较旧的 Javascript 版本中不可用(意思是 - ECMAScript 3rd 和 5th 版本都没有)。

它允许您同时分配 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;
关于最后一个例子的奇怪而有趣的事情:for a function foo(){return 1,2,3;}doconsole.log([].push(foo()))打印出 1。
2021-03-14 23:49:41
Chrome v49 于一周前发布,支持开箱即用的“解构赋值”。
2021-03-21 23:49:41
为什么 var [x, y] = [1, 2]; X; // 1 年;// 2 这在 chrome 中不起作用?引发错误;参考错误:赋值中的左侧无效
2021-03-26 23:49:41
@NaveenAgarwal Chrome 尚未完全支持 ECMAScript 6,其中指定了破坏性分配
2021-04-09 23:49:41

只返回一个对象字面量

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。
2021-03-22 23:49:41

从 ES6 开始,你可以这样做

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

let {dCodes, dCodes2} = newCodes()

返回表达式{dCodes, dCodes2}属性值的简写,相当于 this {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 中试用了!