...扩展运算符的奇特用法

在日常开发中可能会看到这样一段代码

const obj = {
    ...(isXXX && {b: 1})
}

这里的isXXX 是个boolean类型的,为了方便阅读,下面直接写成false

const obj = {
    ...(false && {b: 1})
}

false && {b:1} 的结果是false,为什么在obj对象里...false 没有报错,反而会变成一个空对象

image.png

而直接 ...false 会报错


image.png

分析

因为...运算符的上下文在一个对象里,也就是在obj = { ... } 里,所以要求...右边的值可迭代,但是false很明显是基本类型无法迭代
此时会把false装箱变成 new Boolean(false),上面的代码也就变成了

const obj = {
    ...new Boolean(false)
}

new Boolean出来的是一个对象,只不过没有可枚举的属性了,那对于...来说就相当于空对象,代码也就等同于

const obj = {
    ...{}
}

我们直接这么尝试也是没问题的


image.png

而直接 ...false,则不会触发自动装箱行为
这个时候可能会有人问,那我给他装箱装好直接...呢
比如直接 ...new Boolean(false)
会报语法错误,即便这个变量可迭代可枚举,都不行
因为...只能用于特定的语法环境


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。