JavaScript函数返回多个值作为ES6中的对象

JavaScript函数返回多个值作为ES6中的对象,javascript,ecmascript-6,Javascript,Ecmascript 6,为什么我会收到关于p1,q1值为未定义的的错误消息?但是,以下代码给出了预期结果: function function_name() { var a=1; var b=2; return {a, b} } let {p1, q1} = function_name() 有谁能解释一下这两个代码示例之间的区别吗?这是一种解构,它使用花括号中的键获取赋值的同一键的值。您的函数重新启动一个对象 var o = {p: 42, q: true}; var {p, q}

为什么我会收到关于
p1
q1
值为
未定义的
的错误消息?但是,以下代码给出了预期结果:

function function_name()
{
    var a=1;
    var b=2;

    return {a, b} 
}

let {p1, q1} = function_name()

有谁能解释一下这两个代码示例之间的区别吗?

这是一种解构,它使用花括号中的键获取赋值的同一键的值。您的函数重新启动一个对象

 var o = {p: 42, q: true};
 var {p, q} = o;

 console.log(p); // 42
 console.log(q); // true
然后,您希望获得名称为
p1
p2
的属性。显然,对象中没有具有此名称的键,因此结果中没有属性

{ a: 1, b: 2 }
工作示例

{ a: 1, b: 2 } => get { p1 and p2 } => {}
与其他财产

{ p: 42, q: true } => get { p and q } => { p: 42, q: true }

您获得了所需的输出,因为函数_name()返回一个对象,该对象有两个变量a和b,两个变量都有一些值

{ p: 42, q: true, foo: 42 } => get { p and q } => { p: 42, q: true }
这里
return{a,b}
相当于
return{a:a,b:b}
相当于
return{a:1,b:2}

要获得确切值,您需要将调用方法签名更新为:

function function_name()
{
    var a=1;var b=2;
    return {a,b} 
}

注意:使用a或b作为变量名不是一个好的做法。您应该使用有效的名称

像这样使用

let {a, b} = function_name()

以数组形式返回多个值

是否使用巴贝尔transpiler?您正在测试哪个版本的浏览器?您的答案根本无法解释OP中的问题。另外,一般来说,提供一个代码示例是好的,但它应该是a)尽可能简单,b)代码示例应该附带一个解释,说明为什么您的示例有效,而OP中的示例无效。
function function_name()
{
    var a=1;
    var b=2;

    return [a, b] 
}

let [p1, q1] = function_name()