在JavaScript中返回多个值?

我想在JavaScript中返回两个值。 那可能吗?

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

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

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

那么你可以像这样访问他们:

 var codes = newCodes(); var dCodes = codes[0]; var dCodes2 = codes[1]; 

如果你想在每个返回的值上加上“标签”(比较容易维护),你可以返回一个对象:

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

并访问它们:

 var codes = newCodes(); var dCodes = codes.dCodes; var dCodes2 = codes.dCodes2; 

你可以使用“解构作业”从Javascript 1.7开始。 请注意,这些在旧的Javascript版本中不可用(意思是 – ECMAScript 3rd和5th版本都没有)。

它允许您同时分配给1个以上的variables:

 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语句中的expression式 – 1, 2, 3都不过是一个逗号运算符,依次应用于数字文字( 13 ),最终计算结果为最后一个expression式3的值。 这就是为什么return 1, 2, 3在function上完全相同,只能return 3

 return 1, 2, 3; // becomes return 2, 3; // becomes return 3; 

只要返回一个对象文字

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

Ecmascript 6包含了“解构赋值”(如kangax所提到的),所以在所有浏览器(不仅仅是Firefox)中,您都可以捕获一组值,而不必为了捕获它们而创build一个命名的数组或对象。

 //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)语法,除了破坏赋值外,还使用了对象创build速记。

 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 = rx, y = ry, z = rz; console.log(x, y, z); 

这个语法可以用babel或其他js polyfiller为旧版浏览器填充,但幸运的是现在可以在最新版本的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} } 

除了像其他人推荐的那样返回一个数组或者一个对象外,你也可以使用一个收集器函数(类似于Little Schemer函数):

 function a(collector){ collector(12,13); } var x,y; a(function(a,b){ x=a; y=b; }); 

我做了一个jsperftesting,看看哪三种方法更快。 数组最快,收集器最慢。

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

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