这种带特殊字符属性名怎么用 es6 解构赋值啊?

2021-01-30 13:27:31 +08:00
 az22c

一般来说解构赋值就是这样:

const originObj = {
  foo: 'bar'
}
const { foo } = origin

但是这种怎么解构赋值啊?

const originObj = {
  'extend/foo': 'bar'
}

( 这样有点奇怪,多了一个变量名以实现,但是起码能用: [有点不爽而已] )

const { ['extend/foo']: foo2 } = originObj
2656 次点击
所在节点    JavaScript
6 条回复
autoxbc
2021-01-30 13:42:43 +08:00
那种奇怪的写法才是结构赋值的本体,那个看起来像本体的其实是语法糖,糖能吃就吃,不符合条件就不吃
ssshooter
2021-01-30 13:50:03 +08:00
不是 const { 'extend/foo': foo2 } = originObj 就可以了吗?
az22c
2021-01-30 15:00:10 +08:00
@autoxbc 牛逼 学习了
@ssshooter 是可以,但多出一个 foo2 变量名,搜索替换维护起来麻烦一点点而已
zedhugh
2021-01-30 15:10:22 +08:00
@az22c extend/foo 这个符号再 js 里面也不能作为变量名啊
no1xsyzy
2021-01-31 00:52:24 +08:00
#2 是在说不需要加中括号。字符串字面量确实不用加
libook
2021-02-01 12:00:20 +08:00
在 JavaScript 中,标识符只能包含字母或数字或下划线(“_”)或美元符号(“$”),且不能以数字开头。

楼主混淆了字段名和标识符,这是两个不同的概念,你在对象里用的是字段名,你在程序代码里声明变量常量用的是标识符,解构只是一个方便把字段值(或引用)赋值给同名标识符的语法糖而已,并不是说两者是一样的东西。就像是字符串转数值的时候也是只支持符合数值书写规则的字符串,否则就会得到 NaN 。

可以思考一下,如果自己设计一个 JS 引擎,如何解析 ``` const { extend/foo } = originObj; ````这种语句,要解析成预期的解构结果,但又不会引起其他语法歧义。

所以按照 JS 对于字段名和标识符的定义来说,在使用解构语法前最好确保字段名的命名规则符合标识符命名规则,否则就不可能创建同名的标识符(就像你自己直接写```const extend/foo = 'bar';```一样会报错)。

如果只有一个字段要拿,完全可以直接``` const foo2 = originObj['extend/foo']; ```这样既简单,可读性也高。

语言的任何特性都是有其适用场景和不适用场景的,否则旧特性就没有存在的意义了;同样的,解构特性也不是说大家都不要用非解构的写法,而是方便就用、不方便就不用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/749813

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX