在日常开发中可能会看到这样一段代码
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