对象的动态条件属性与数组的动态条件元素

874 阅读2分钟

对象的动态条件属性与数组的动态条件元素

1. 对象的动态条件属性

长话短说上代码:

const a = true
const b = {
          c: 'c',
          ...( a && {d: 'd'}),
          }

b的结果将会是{ c: 'c', d: 'd' }。 分析一下这个代码,先说 && 运算符。 &&也可以算作一种短路运算符,它左侧的值如果为真那么将会返回 && 右侧的值。(||运算符有那么一些相反的意思。)
比如这个例子,a为真的情况下之际上执行的是 { c: 'c', ...{ d : 'd' }}
所以在解构之后得到了值{ c: 'c', d: 'd' }

这个有什么用?
这个代码十分好用,比如根据不同条件来创建不同对象的时候,经常在Ajax请求的时候会用到。这样做的优点是消除大量的if判断条件,精简代码逻辑,在熟悉之后一目了然让代码变得十分简洁。缺点是略微难以理解,不过如果长期使用,这种写法自然会变为常规操作。

2. 数组的动态条件元素

数组也有相应的版本:

const a = true
const b = [1,
           2,
           ...(a ? [3] : []),
           ]

b的结果将会是[1,2,3]。这里当a为真的时候,对[3]进行解构,返回3。如果a为假的时候,对[]解构,什么都不返回(也不返回undefinednull!),b的值就会返回[1,2]

这个有什么用?
这个用处也很大。可以根据条件定义数组的元素,非常灵活,可以消除大量不必要的if条件语句。缺点也是不直观,如果没用过需要时间熟悉。

结语

总之,我认为,这两个“技巧”可以优化代码逻辑,消除不必要的废话。另外,这两种写法都是来自互联网,在ES6的解构运算符出现之后新出现的写法。在我看来,这都是ES6的常规操作,是必须要掌握而且使用起来的标准写法。有人认为这是一种hack,在滥用JS的特性;我强烈反对这种说法。这些新的写法,都是新的标准操作,是必须要适应的。JS发展非常快,如果不迅速掌握,必然被时代淘汰。

参考资料:

github.com/tc39/propos…

stackoverflow.com/questions/1…