我试图在 JavaScript 中返回两个值。这可能吗?
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 syntax*,您还可以更直观地解构返回值:
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 了解浏览器兼容性。基本上,除了 IE 之外的所有现代浏览器都支持这种语法,但您可以在构建时使用 Babel 等工具将 ES6 代码编译为与 IE 兼容的 JavaScript。
您可以使用数组和 "destructuring assignments" 从 ECMAScript 6 开始执行此操作。请注意,这些在较旧的 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
您还可以使用 object destructuring combined with property value shorthand 命名对象中的返回值并挑选出您想要的值:
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}
。
最后一行的这个赋值叫做object destructing assignment。它提取对象的属性值并将其分配给同名变量。如果您想将返回值分配给不同名称的变量,您可以这样做 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)语法是除了破坏赋值之外还使用对象创建简写。
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 和其他语言之间常见的性能技巧。
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}
}
除了按照其他人的建议返回数组或对象外,您还可以使用收集器函数(类似于 The Little Schemer 中的那个):
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
在 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
在 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);
};
:)
砰!这只是解决您的问题的另一种方法。
你也可以这样做:
function a(){
var d=2;
var c=3;
var f=4;
return {d:d,c:c,f:f}
}
const {d,c,f} = a()
添加缺少的重要部分以使此问题成为完整的资源,因为这会出现在搜索结果中。
对象解构
在对象解构中,您不一定需要使用与变量名称相同的键值,您可以通过如下定义来分配不同的变量名称:
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
之后破坏任何内容没有任何意义。
我希望这会给这个问题增加一些价值:)
您可以使用“对象”
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
,
是一个运算符,可用于任何表达式。这里的 return
没有什么特别之处。
我建议使用最新的解构分配(但make sure it's supported in your environment)
var newCodes = function () {
var dCodes = fg.codecsCodes.rs;
var dCodes2 = fg.codecsCodes2.rs;
return {firstCodes: dCodes, secondCodes: dCodes2};
};
var {firstCodes, secondCodes} = newCodes()
我知道有两种方法可以做到这一点: 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;
回答这个问题的重点是分享这种以良好格式获取 Date 的方法。希望它对你有帮助:)
我在这里没有添加新内容,而是另一种替代方式。
var newCodes = function() {
var dCodes = fg.codecsCodes.rs;
var dCodes2 = fg.codecsCodes2.rs;
let [...val] = [dCodes,dCodes2];
return [...val];
};
好吧,我们不能完全按照您的尝试去做。但是可以做一些可能低于的事情。
function multiReturnValues(){
return {x:10,y:20};
}
然后在调用方法的时候
const {x,y} = multiReturnValues();
console.log(x) ---> 10
console.log(y) ---> 20
可以使用模板文字`${}`返回一个包含许多值和变量的字符串
喜欢:
var newCodes = function() {
var dCodes = fg.codecsCodes.rs;
var dCodes2 = fg.codecsCodes2.rs;
return `${dCodes}, ${dCodes2}`;
};
它简短而简单。
return {dCodes : dCodes, dCodes2 : dCodes2};
以使其更易于引用。const { dCodes, dCodes2 } = newCodes();
return {dCodes, dCodes2}
的工作方式与@Intelekshual 提到的相同,并且 (2) 使用相同的函数,您可以简单地使用解构数组[dCodes, dCodes2] = newCodes()
或 (3) 对象({dCodes, dCodes2} = newCodes())
(无需在@Taylor 那里使用声明,尽管var
更适合当前 Sasha 的示例)。