18. logical-assignment-operators

  1. // 例子 18-1
  2.  
  3. a ||= b;
  4.  
  5. obj.a.b ||= c;
  6.  
  7. a &&= b;
  8.  
  9. obj.a.b &&= c;

Babel 编译为:

  1. var _obj$a, _obj$a2;
  2.  
  3. a || (a = b);
  4.  
  5. (_obj$a = obj.a).b || (_obj$a.b = c);
  6.  
  7. a && (a = b);
  8.  
  9. (_obj$a2 = obj.a).b && (_obj$a2.b = c);

出现的原因:

  1. // 例子 18-2
  2.  
  3. function example(a = b) {
  4. // a 必须是 undefined
  5. if (!a) {
  6. a = b;
  7. }
  8. }
  9.  
  10. function numeric(a = b) {
  11. // a 必须是 null 或者 undefined
  12. if (a == null) {
  13. a = b;
  14. }
  15. }
  16.  
  17. // a 可以是任何 falsy 的值
  18. function example(a = b) {
  19. // 可以,但是一定会触发 setter
  20. a = a || b;
  21.  
  22. // 不会触发 setter,但可能会导致 lint error
  23. a || (a = b);
  24.  
  25. // 就有人提出了这种写法:
  26. a ||= b;
  27. }

需要 @babel/plugin-proposal-logical-assignment-operators 插件支持