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

为何带默认值的简写属性初始化在函数参数可用,对象赋值却报错?

问题:为何对象简写语法在函数参数与对象字面量中表现不同?

现有对象:

let student = {name: "Josh"}

以及函数:

function getData({name, age = 20}){console.log(name, age)}

该函数可正常运行,输出name与默认值20。但执行以下代码时,会抛出Uncaught SyntaxError: Invalid shorthand property initializer错误:

let name = "Mike"; let anotherStudent = {name, age = 20}

为何该简写语法在两种场景表现不同?


解答

这俩场景用的根本不是同一种语法,只是写法相似而已:

  1. 函数参数里的{name, age = 20}是解构赋值的默认值语法
    函数参数位置的大括号属于对象解构赋值逻辑,这里的age = 20是给解构出的age变量设置默认值——当传入的对象没有age属性时,就用20作为age的取值。整个逻辑是“从传入对象里提取name和age,age没值就用20”,完全符合解构赋值的规则。

  2. 对象字面量里的age = 20不符合语法规则
    对象字面量的简写语法只有两种合法情况:

    • 变量名直接作为属性名,值取变量本身:比如{name}等价于{name: name}
    • 方法简写:比如{sayHi(){}}等价于{sayHi: function(){}}

而age = 20是一个赋值表达式,不能直接放在对象字面量里当作属性定义。如果想给对象的age属性设默认值,要么直接写键值对{name, age: 20},要么先定义age变量再用简写:

let name = "Mike";
let age = 20;
let anotherStudent = {name, age};

总结来说:函数参数里的大括号是解构赋值,支持默认值写法;对象字面量里的大括号是定义对象的语法,不支持属性名 = 值这种写法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:12:44