在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
都不过是一个逗号运算符,依次应用于数字文字( 1
和3
),最终计算结果为最后一个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,看看哪三种方法更快。 数组最快,收集器最慢。
你也可以这样做:
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; }