为何带默认值的简写属性初始化在函数参数可用,对象赋值却报错?
问题:为何对象简写语法在函数参数与对象字面量中表现不同?
现有对象:
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}
为何该简写语法在两种场景表现不同?
解答
这俩场景用的根本不是同一种语法,只是写法相似而已:
函数参数里的
{name, age = 20}是解构赋值的默认值语法
函数参数位置的大括号属于对象解构赋值逻辑,这里的age = 20是给解构出的age变量设置默认值——当传入的对象没有age属性时,就用20作为age的取值。整个逻辑是“从传入对象里提取name和age,age没值就用20”,完全符合解构赋值的规则。对象字面量里的
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
相关产品推荐
相关产品推荐

