ChatGPT解决这个技术问题 Extra ChatGPT

在 JavaScript 中返回多个值?

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

var newCodes = function() {  
    var dCodes = fg.codecsCodes.rs;
    var dCodes2 = fg.codecsCodes2.rs;
    return dCodes, dCodes2;
};
您可以通过使用回调来解决这个问题,如果您愿意这样做,请参阅我的回答。人们忘记了你可以使用 JS 轻松地“返回多个值”,使用元组甚至:回调!
答案已经过时了。现在是可能的。 2ality.com/2014/06/es6-multiple-return-values.html
从技术上讲,您仍然返回单个对象/数组,这只是 ES6 中更简单的解构。
我相信安德里亚指的是“解构”。但是,是的,您仍然不会从函数中返回超过一项:一项可以是包含任意数量的键的对象或具有 n 项的数组。

u
user229044

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

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。


或者您可以返回一个对象:return {dCodes : dCodes, dCodes2 : dCodes2}; 以使其更易于引用。
你甚至可以返回一个对象 {:dCodes: dCodes, dCodes2: dCodes2} 功能相同,但是当你引用返回的对象时,你有一些更具可读性的代码,如 obj.dCodes 和 obj.dCodes2 vs obj[0] 和 obj[1 ]
@alexela 当然你可以简单地使用 var dCodes = newCodes().dCodes; var dCodes2 = newCodes().dCodes2 但是,您将调用该函数两次,如果它很复杂,这可能会浪费资源。
@VadimKirilchuk 无需使用 destructuring assignment 调用它两次 - 例如。 const { dCodes, dCodes2 } = newCodes();
正如其他答案所说(和暗示的评论),ES6在这里带来了一些选择。 3 确切地说:(1) object property shorthand return {dCodes, dCodes2} 的工作方式与@Intelekshual 提到的相同,并且 (2) 使用相同的函数,您可以简单地使用解构数组 [dCodes, dCodes2] = newCodes() 或 (3) 对象 ({dCodes, dCodes2} = newCodes()) (无需在@Taylor 那里使用声明,尽管 var 更适合当前 Sasha 的示例)。
F
FZs

您可以使用数组和 "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 - 只不过是按顺序应用于数字文字(123)的逗号运算符,最终计算为其最后一个表达式的值 - 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。
为什么 var [x, y] = [1, 2]; X; // 1年; // 2 这在 chrome 中不起作用?引发错误; ReferenceError:分配中的左侧无效
@NaveenAgarwal Chrome 尚不完全支持指定破坏赋值的 ECMAScript 6
Chrome v49 于一周前发布,支持开箱即用的“解构分配”。
S
Sean Kinsey

只需返回一个对象字面量

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。
P
Peracek

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


u
user3015682

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 中试用了!


E
Ebrahim Byagowi

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


那还没有在 IE 或 Edge 上工作,只是想注意一下。
已经使用了很多......使用数组更快/更顺畅,如果可能的话避免构造对象,如@user3015682所示。
B
Behnam Mohammadi
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}
}

然后为每个变量再次运行该函数?这不是最好的方法。
每次解释器遇到 a() 时,它都会再次运行该函数。所以,var f = a().f; var c = a().c; var d = a().d;会启动 a() 3 次,容易造成性能损失。更好的方法是 var result = a();变量 f = 结果.f;等等
好的,为了获得更好的性能,您可以保留变量的值并使用它,例如 var result=a();并使用值 result.d 或 result.c 和 result.f ,因此只需一次运行 a() 函数。
Z
Zelenova

除了按照其他人的建议返回数组或对象外,您还可以使用收集器函数(类似于 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


通常将 collector 称为 continuation 而该技术称为 CPS
A
Alireza

在 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

A
Alexander Mills

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

:)

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


J
Joris Mans

你也可以这样做:

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

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

N
Nimeshka Srimal

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

对象解构

在对象解构中,您不一定需要使用与变量名称相同的键值,您可以通过如下定义来分配不同的变量名称:

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 之后破坏任何内容没有任何意义。

我希望这会给这个问题增加一些价值:)


s
sebu

您可以使用“对象”

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

    return obj;
}

这是 IE 的必经之路。稍后使用如:let obj = newCodes();警报(obj.dCodes);
A
Artemii

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

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

>> foo()
>> 3

, 是一个运算符,可用于任何表达式。这里的 return 没有什么特别之处。
A
AMTourky

我建议使用最新的解构分配(但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()

K
Kallol Medhi

我知道有两种方法可以做到这一点: 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>

k
krupesh Anadkat

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

从许多返回值中,我需要它只返回给定条件的特定值,然后返回与其他条件相对应的其他返回值。

这是我如何做到的示例:

功能:

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


N
Nick

我在这里没有添加新内容,而是另一种替代方式。

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

A
Anjana

好吧,我们不能完全按照您的尝试去做。但是可以做一些可能低于的事情。

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

然后在调用方法的时候

const {x,y} = multiReturnValues();

console.log(x) ---> 10
console.log(y) ---> 20

D
David Buck

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

喜欢:

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

它简短而简单。