• 请使用字面量值创建对象,eslint: no-new-object

      // bad
      const a = new Object{}
      
      // good
      const a = {}
    • 别使用保留字作为对象的键值,这样在 IE8 下不会运行

      // bad
      const a = {
        default: {},  // default 是保留字
        common: {}
      }
      
      // good
      const a = {
        defaults: {},
        common: {}
      }
    • 当使用动态属性名创建对象时,请使用对象计算属性名来进行创建

      原因:因为这样做就可以让你在一个地方定义所有的对象属性

      function getKey(k) {
        return `a key named ${k}`
      }
      
      // bad
      const obj = {
        id: 5,
        name: 'San Francisco'
      };
      obj[getKey('enabled')] = true
      
      // good
      const obj = {
        id: 5,
        name: 'San Francisco',
        [getKey('enabled')]: true
      };
    • 请使用对象方法的简写方式,eslint: object-shorthand

      // bad
      const item = {
        value: 1,
      
        addValue: function (val) {
          return item.value + val
        }
      }
      
      // good
      const item = {
        value: 1,
      
        addValue (val) {
          return item.value + val
        }
      }
    • 请使用对象属性值的简写方式,eslint: object-shorthand

      原因:这样更简短且描述更清楚

      const job = 'FrontEnd'
      
      // bad
      const item = {
        job: job
      }
      
      // good
      const item = {
        job
      }
    • 将简写的对象属性分组后统一放到对象声明的开头

      原因:这样更容易区分哪些属性用了简写的方式

      const job = 'FrontEnd'
      const department = 'JDC'
      
      // bad
      const item = {
        sex: 'male',
        job,
        age: 25,
        department
      }
      
      // good
      const item = {
        job,
        department,
        sex: 'male',
        age: 25
      }
    • 只对非法标识符的属性使用引号,eslint: quote-props

      原因:因为通常来说我们认为这样主观上会更容易阅读,这样会带来代码高亮上的提升,同时也更容易被主流 JS 引擎优化

      // bad
      const bad = {
        'foo': 3,
        'bar': 4,
        'data-blah': 5
      }
      
      // good
      const good = {
        foo: 3,
        bar: 4,
        'data-blah': 5
      }
    • 不要直接使用Object.prototype的方法, 例如hasOwnProperty

      propertyIsEnumerableisPrototypeOf方法,eslint:no-prototype-builtins

      原因:这些方法可能会被对象自身的同名属性覆盖 - 比如 { hasOwnProperty: false } 或者对象可能是一个 null 对象(Object.create(null))

      // bad
      console.log(object.hasOwnProperty(key))
      
      // good
      console.log(Object.prototype.hasOwnProperty.call(object, key))
      
      // best
      const has = Object.prototype.hasOwnProperty // cache the lookup once, in module scope.
      console.log(has.call(object, key))
      /* or */
      import has from 'has' // https://www.npmjs.com/package/has
      console.log(has(object, key))
    • 优先使用对象展开运算符 ... 来做对象浅拷贝而不是使用 Object.assign,使用对象剩余操作符来获得一个包含确定的剩余属性的新对象

      // very bad
      const original = { a: 1, b: 2 }
      const copy = Object.assign(original, { c: 3 }) // this mutates `original` ಠ_ಠ
      delete copy.a // so does this
      
      // bad
      const original = { a: 1, b: 2 }
      const copy = Object.assign({}, original, { c: 3 }) // copy => { a: 1, b: 2, c: 3 }
      
      // good
      const original = { a: 1, b: 2 }
      const copy = { ...original, c: 3 } // copy => { a: 1, b: 2, c: 3 }
      
      const { a, ...noA } = copy // noA => { b: 2, c: 3 }
    文档更新时间: 2021-05-11 16:00   作者:姚连洲