Object.assign 还能这么用吗?

2019-10-29 17:20:04 +08:00
 howell5

看到一篇文章: https://nbsaw.surge.sh/#/post/71

作者想把

var colors = {
  gray: {
     default: "#DDDDDD",
     light: "#EEEEEE",
     dark: "#CCCCCC"
  })
}

省去 default, 实现这样的效果:

const Components =  styled.div`
  background: ${ colors.gray }; // background: #DDDDDD
`
const Components2 =  styled.div`
  background: ${ colors.gray.light }; // background: #EEEEEE
`
const Components3 =  styled.div`
  background: ${ colors.gray.dark }; // background: #CCCCCC
`

实现的方法是这样:

const colors = {
  gray: Object.assign("#DDDDDD", {
     light: "#EEEEEE",
     dark: "#CCCCCC"
  })
}

一开始是感兴趣的,但是发现自己确实实现不了,返回的 colors.gray 是个 object, 查了下 MDN 上 Object.assign 的首个参数只能是 object, 就算不是 object 也会转成 object。

所以问题是:

1778 次点击
所在节点    程序员
19 条回复
CoverL
2019-10-29 17:39:02 +08:00
String 为包装类型,String(colors.gray) === ‘#dddddd’; 看下相关知识吧
codingBug
2019-10-29 17:45:41 +08:00
学到了
AlphaTr
2019-10-29 17:47:58 +08:00
const a = Object.assign("#DDDDDD", {light: "#EEEEEE", dark: "#CCCCCC"}); console.log(`${a}, ${a.light}`); 原生就这么用就行吧
xxx749
2019-10-29 18:02:17 +08:00
学到了
cheeto
2019-10-29 18:08:06 +08:00
https://stackoverflow.com/questions/42560540/what-happens-when-i-object-assign-to-a-primitive-type-in-javascript

colors.gray 是个 Object 没错,在使用${}模版字符串占位符时,应该就默认调用了它的 toString()方法吧,使其输出为#DDDDDD
roscoecheung1993
2019-10-29 18:19:52 +08:00
ecma 定义 Object.assign 的第一步:第一个参数 toObject,

Let to be ToObject(target)

string ToObject 操作如下

Return a new String object whose [[StringData]] internal slot is set to the value of argument

所以原生这么写没毛病
zzlit
2019-10-29 19:26:43 +08:00
学习一下
shiny
2019-10-29 19:28:53 +08:00
js 正是一门可以活到老学到老的语言,寿与天齐,千秋万载,一统江湖
howell5
2019-10-29 21:08:03 +08:00
@roscoecheung1993 @CoverL @cheeto @AlphaTr
ok, 我 get 到了。返回的是 object 没错。忽略了 toString()的隐形触发 -_-|| 。
只有当实际使用到类似于${}自动触发或者自己手动触发 toString()去使用。感谢各位。
zbinlin
2019-10-29 22:23:48 +08:00
你可以这样定义:

var colors = {
gray: {
toString: () => "#DDDDDD",
light: "#EEEEEE",
dark: "#CCCCCC",
},
};

'#DDDDDD' === `${colors.gray}`
'#EEEEEEE' === `${colors.gray.light}`
'#CCCCCC' === `${colors.gray.dark}`
chuxiaonan
2019-10-29 22:35:32 +08:00
toString() 可以做到
Proxy 应该也可以
chuxiaonan
2019-10-29 22:42:02 +08:00
试了一下 Proxy 似乎并不可以
ssshooter
2019-10-29 23:16:44 +08:00
有点意思
autoxbc
2019-10-30 03:44:25 +08:00
基本包装类型另一个玩法是把包装作为容器,挂载一些私有数据上去
比如对一个基本类型数据做链式加工,原始值挂在包装上,可以在需要时提取出来
ruandao
2019-10-30 05:36:05 +08:00
div ' 的是什么无法?
ericgui
2019-10-30 05:50:20 +08:00
@ruandao

这个用的是 styled components
你查一下
ericgui
2019-10-30 05:53:30 +08:00
galikeoy
2019-10-30 10:44:33 +08:00
@ericgui #16 怎么感觉跟 react 组件语法相似呢
userdhf
2019-10-30 16:43:53 +08:00
相当于是在包装类型上挂载了几个{}吗?
类似于 var arr=[]; a.my="asdasd";这样?

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

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

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

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

© 2021 V2EX