首页 文章

在JavaScript中返回多个值?

提问于
浏览
617

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

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

14 回答

  • 960

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

    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;
    
  • 4

    最好的方法是

    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}
    }
    
  • 53

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

  • 19

    从ES6开始,你就可以做到这一点

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

    返回表达式 {dCodes, dCodes2}property value shorthand ,等同于 {dCodes: dCodes, dCodes2: dCodes2} .

    最后一行的这个赋值叫做 object destructing assignment . 它提取对象的属性值并将其分配给同名变量 . 如果您想将返回值分配给不同名称的变量,您可以这样做 let {dCodes: x, dCodes2: y} = newCodes()

  • 20

    您可以使用"destructuring assignments"从Javascript 1.7开始执行此操作 . 请注意,这些版本在较旧的Javascript版本中不可用(意思是 - 无论是ECMAScript 3rd还是5th edition) .

    它允许您同时分配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允许你__19851_这一事实所迷惑 . 真正发生的事情并非如此 . return语句中的表达式 - 1, 2, 3 - 只是一个逗号运算符,它依次应用于数字文字( 123 ),最终计算其最后一个表达式的值 - 3 . 这就是为什么 return 1, 2, 3 在功能上只与 return 3 相同 .

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

    你可以使用“对象”

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

    在JS中,我们可以轻松返回带有数组或对象的元组,但不要忘记! => JS是面向 callback 的语言,这里有一个小秘密"returning multiple values",没有人提到过,试试这个:

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

    :)

    嘭!这只是解决问题的另一种方法 .

  • 23

    我建议使用最新的 destructuring assignment (但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()
    
  • 15

    除了像其他人推荐的那样返回数组或对象之外,您还可以使用收集器函数(类似于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

  • -1

    一切都正确 . return 逻辑上从左到右处理并返回最后一个值 .

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

    你也可以这样做:

    function a(){
      var d=2;
      var c=3;
      var f=4;
      return {d:d,c:c,f:f}
    }
    
    const {d,c,f} = a()
    
  • -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);
    
  • 1

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

    From many return values , i needed it to return only specific value for a given condition and then other return value corresponding to other condition.


    这是我如何做到的例子:

    Function:

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

    Getting Required return value from object returned by function :

    var todayDate = myTodayDate().myDate;
    var todayDay = myTodayDate().myDay;
    var todayMonth = myTodayDate().myMonth;
    var todayYear = myTodayDate().year;
    

    回答这个问题的重点是分享这种以良好格式获取日期的方法 . 希望它能帮助你:)

  • 6

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

相关问题