You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中是否有类似Python字典传参的对象传参方式?

JavaScript中实现类似Python字典的函数传参解包

Python中的示例

在Python中,我们可以用**运算符将字典的键值对作为关键字参数传入函数,无需逐个传递变量:

user = {
    'firstname':'John',
    'lastname': 'Wick'
}

def fullname(firstname, lastname):
    return firstname + ' ' + lastname

# 使用字典解包传参
fullname(**user)
# 输出: 'John Wick'

而不用繁琐地逐个提取属性:

fullname(user['firstname'], user['lastname'])
# 输出: 'John Wick'

问题与尝试

在JavaScript中,是否存在类似的便捷方式,将对象传入函数而非逐个传递变量?注意:函数不可修改

尝试使用...运算符处理对象时触发了错误:

const user = {
    'firstname':'John',
    'lastname': 'Wick'
}

function fullname(firstname, lastname){
    return firstname + ' ' + lastname;
}

fullname(...user)
// 报错: Uncaught TypeError: Found non-callable @@iterator

解决方案

1. 按位置传参(类似Python的*列表解包)

如果对象属性的顺序和函数参数的顺序完全一致,可以用Object.values()将对象的值转为数组,再用...展开传递:

fullname(...Object.values(user))
// 输出: 'John Wick'

⚠️ 注意:这种方式依赖属性顺序,若对象属性顺序改变或函数参数顺序调整,会导致传参错误。

2. 解构赋值简化提取(更接近Python的**关键字匹配)

如果想按参数名匹配(不依赖顺序),可以先通过解构赋值提取对象属性,再传递给函数:

const { firstname, lastname } = user;
fullname(firstname, lastname);
// 输出: 'John Wick'

这种方式既保留了按名称匹配的安全性,又比手动写user.firstname更简洁。

为什么直接用...user会报错?

JavaScript中,函数调用时的...运算符只能展开可迭代对象(如数组、字符串、Set等),普通对象默认没有实现迭代器接口,因此直接展开会抛出类型错误。


内容的提问来源于stack exchange,提问作者Mansur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:45:30