symbol

1. 唯一值

        <script type="text/javascript">
            // bad
            // 1. 创建的属性会被 for-in 或 Object.keys() 枚举出来
            // 2. 一些库可能在将来会使用同样的方式,这会与你的代码发生冲突
            if (element.isMoving) {
              smoothAnimations(element);
            }
            element.isMoving = true;
            
            // good
            if (element.__$jorendorff_animation_library$PLEASE_DO_NOT_USE_THIS_PROPERTY$isMoving__) {
              smoothAnimations(element);
            }
            element.__$jorendorff_animation_library$PLEASE_DO_NOT_USE_THIS_PROPERTY$isMoving__ = true;
            
            // better
            var isMoving = Symbol("isMoving");
            
            ...
            
            if (element[isMoving]) {
              smoothAnimations(element);
            }
            element[isMoving] = true;
        </script>

2. 魔术字符串
魔术字符串指的是在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。
魔术字符串不利于修改和维护,风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。

        <script type="text/javascript">
            // bad
            const TYPE_AUDIO = 'AUDIO'
            const TYPE_VIDEO = 'VIDEO'
            const TYPE_IMAGE = 'IMAGE'
            
            // good
            const TYPE_AUDIO = Symbol()
            const TYPE_VIDEO = Symbol()
            const TYPE_IMAGE = Symbol()
            
            function handleFileResource(resource) {
              switch(resource.type) {
                case TYPE_AUDIO:
                  playAudio(resource)
                  break
                case TYPE_VIDEO:
                  playVideo(resource)
                  break
                case TYPE_IMAGE:
                  previewImage(resource)
                  break
                default:
                  throw new Error('Unknown type of resource')
              }
            }
        </script>

3. 私有变量
Symbol 也可以用于私有变量的实现。

        <script type="text/javascript">
            const Example = (function() {
                var _private = Symbol('private');
            
                class Example {
                    constructor() {
                      this[_private] = 'private';
                    }
                    getName() {
                      return this[_private];
                    }
                }
            
                return Example;
            })();
            
            var ex = new Example();
            
            console.log(ex.getName()); // private
            console.log(ex.name); // undefined
        </script>
原文地址:https://www.cnblogs.com/wangxi01/p/11590134.html