티스토리 뷰

목차

    반응형

    ESLint Rules는 JavaScript의 역사와 지식이 담겨있습니다. 그래서 ESLint Rules를 공부하는 것만으로도 자바스크립트를 깊이 이해할 수 있습니다.


    아래 코드는 어디까지나 대표적인 예시입니다. 각각의 규칙은 옵션에 따라 규칙을 변경할 수 있어서 최적의 코드는 아닐 수 있습니다.


    하지만, 아래 소개할 글은 (비록 길지만) 정독해두면 코딩할 때 많은 도움이 될 거라 생각합니다.

    for-direction

    for문 긍정적인 방향으로 작성하는 것을 강제합니다.


    // NG

    for (var i = 0; i < 10; i--) {

      console.log(i)

    }


    // OK

    for (var i = 0; i < 10; i++) {

      console.log(i)

    }


    getter-return

    get 구문에서 return을 무조건 작성해야 합니다.


    // NG

    var hoge = {

      get name () {

        console.log('hoge')

      }

    }


    // OK

    var hoge = {

      get name () {

        return 'hoge'

      }

    }

    no-await-in-loop

    await를 반복문에서 사용하는 것을 금지합니다.


    // NG

    async function ngHoge () {

      let dataList = []

      let data

      for (let i = 0; i < 10; i++) {

        data = await doSomething(i)

        dataList.push(data)

      }

      return dataList

    }


    // OK

    async function okHoge () {

      let dataList = []

      for (let i = 0; i < 10; i++) {

        dataList.push(doSomething)

      }

      return await Promise.all(dataList)

    }


    no-compare-neg-zero

    -0과 비교하는 것을 금지합니다.


    // NG

    var i = 0

    if (i === -0) {

      console.log(i)

    }


    no-cond-assign

    조건식에서 대입하는 것을 금지합니다.


    // NG

    const obj = {}

    if (obj.hoge = true) {

      console.log(i)

    }


    no-console

    console 사용하는 것을 금지합니다.

    console은 production 환경을 푸시하기 전에 제거되어야 합니다.


    // NG

    console.log('log')

    console.warn('warn')

    console.error('error')


    no-constant-condition

    조건식 상수(예를 들어 리터럴)를 삽입하는 것을 금지합니다.


    // NG

    if (false) {

      doSomethingForDevelopment()

    }


    // OK

    if (env === 'development') {

      doSomethingForDevelopment()

    }


    no-control-regex

    정규표현식에서 제어 문자 지정하는 것을 금지합니다.

    정규표현식에서 제어 문자 사용하는 것은 드물며 대부분의 경우 오타입니다.


    // NG

    var pattern1 = /Hello¥x0aWorld/

    var pattern2 = new RegExp("Hello¥x0aWorld")


    // OK

    var pattern1 = /Hello¥sWorld/

    var pattern2 = new RegExp("Hello¥sWorld")

    no-debugger

    debugger 문장 사용을 금지합니다.

    debugger 디버그를 위해 사용하는 코드에 포함되면 안 됩니다.


    // NG

    function hoge () {

      debugger

      console.log('hoge')

    }


    no-dupe-args

    함수 정의 시에 중복 인수를 금지합니다.


    // NG

    function example (hoge, fuga, hoge) {

      console.log(hoge)

    }


    no-dupe-keys

    객체 정의 시 중복된 키 이름을 금지합니다.


    // NG

    const obj = {

      key1: 'key1',

      key1: 'key2'

    }


    no-duplicate-case

    switch 문에 중복된 케이스 라벨을 금지합니다.


    // NG

    switch (hoge) {

      case 1:

        console.log('This is case 1')

        break

      case 2:

        console.log('This is case 2')

        break

      case 1:

        console.log('This is case 3')

        break

    }


    no-empty

    빈 블록을 금지합니다.

    기술적으로 잘못된 것은 아니지만, 코드를 읽을 때 헷갈릴 수 있습니다.


    // NG

    function example (x) {

      if (x) {

      }

      switch (x) {

      }

    }


    no-empty-character-class

    정규표현식에서 빈 character classes[]를 사용하는 것을 금지합니다.

    빈 []은 무엇과도 일치하지 않으므로 오타입니다.


    // NG

    var hoge = /abc[]/


    // OK

    var fuga = /abc[a-z]/


    no-ex-assign

    cache절에서 예외 개체에 대한 재할당을 금지합니다.

    예외 개체에 대한 대체 연결 수단은 존재하지 않아 대입할 경우 무조건 에러입니다.


    // NG

    try {


    } catch (e) {

      e = new Error()

    }


    no-extra-boolean-cast

    불필요한 Boolean 형태로 변환하는 것을 금지합니다.

    if문 등의 조건식에는 식의 결과가 무조건 Boolean입니다.


    var example = 10


    // NG

    if (Boolean(example)) {


    }

    if (!!example) {


    }


    // OK

    if (example) {


    }

    if (!example) {


    }


    no-extra-parens

    불필요한 괄호를 금지합니다.


    // NG

    var total = (10 * 20) - 30


    no-extra-semi

    불필요한 세미콜론을 금지합니다.

    불필요한 세미콜론은 기술적인 오류는 아니지만, 코드를 읽을 때 헷갈립니다.


    // NG

    var example = 5;;


    function example () {

      console.log('sample')

    };

    no-func-assign

    함수에 다시 대입하는 것을 금지합니다.


    // NG

    function example () {

      console.log('before')

    }

    example = true


    no-inner-declarations

    블록 내에서 함수 선언을 금지합니다. 그러나 블록 내에서의 함수식은 허용됩니다.


    // NG

    if (true) {

      function example () {

        console.log('example')

      }

    }


    // OK

    if (true) {

      var example = function () {

        console.log('example')

      }

    }


    no-invalid-regexp

    RegExp 생성자에서 잘못된 정규식을 지정하는 것을 금지합니다.

    정규식 리터럴을 사용했을 때 코드를 파싱하면 SyntaxError가 발생하지만, RegExp 개체의 경우 코드가 실행되었을 때 SyntaxError가 발생하기 때문입니다.


    // NG

    var regexp = new RegExp('[')


    no-irregular-whitespace

    잘못된 공백을 금지합니다.

    무효 또는 불규칙한 공백은 ECMAScript5 파서에서 문제를 일으키는 코드의 디버깅을 어렵게 합니다.


    // NG

    function thing() {

        return 'test'; /*<ENSP>*/

    }

    function thing() {

        return `template <NBSP>string`;

    }


    no-obj-calls

    글로버 객체를 함수로 호출하는 것을 금지합니다.

    EcmaScript는 대문자 전역 개체를 제공하지만, 그 함수들은 실행하면 오류가 발생합니다.


    // NG

    Math()

    var json = JSON()

    var reflect = Reflect()


    no-prototype-builtins

    Object.create에서 생성한 객체에 대해 Object.prototypes의 메소드(함수) 직접 호출을 금지합니다.


    var parent = function () {

      return this

    }

    parent.prototype.hoge = function () {

      console.log('hoge')

    }


    var child = Object.create(parent)


    // NG

    var hasHoge = child.hasOwnProperty('hoge')


    // OK

    var hasHoge = Object.hasOwnProperty.call(child, 'hoge')


    no-regex-spaces

    정규표현식에서 여러 공백을 금지합니다.

    정규표현식은 실수를 없애기 위해 가능한 한 단순하게 유지해야 합니다.


    // NG

    var regex = /Hell   World/

    var regex = new RegExp("Hello   World")


    // OK

    var regex = /Hell {3}World/

    var regex = new RegExp("Hello {3}World")


    no-sparse-arrays

    빈 배열을 만드는데 스퍼스(Spurs) 배열 사용하는 것을 금지합니다.

    스퍼스 배열 구현 의도를 이해하기 어렵고 혼란스럽습니다.


    // NG

    var array1 = [,,]

    var array2 = ['red',,'blue']


    // OK

    var array1 = new Array(3)

    var array2 = ['red', 'blue', ] // 마지막 쉼표는 OK


    no-template-curly-in-string

    일반적으로 문자열에서 템플릿 문자열의 자리 표시자 사용을 금지합니다.

    템플릿 문자열을 잘못된 일반 문자열로 사용하는 것을 방지합니다.


    // NG

    var str1 = "Hello ${wld}"

    var str2 = 'Hello ${wld}'


    no-unexpected-multiline

    혼란스러운 여러 줄(개행)은 금지합니다.

    개행은 몇 가지 규칙을 제외하고 자동 세미콜론 삽입하여 끝냅니다.


    // NG

    var foo = bar

    (1 || 2).baz();

    (개행)

    (개행)


    // OK

    var foo = bar;

    (1 || 2).baz();

    no-unreachable

    return, throw, continue, break 문에 닿지 못하는 코드를 금지합니다.


    // NG

    function hoge () {

      return 'hoge'

      console.log('hoge')

    }


    no-unsafe-finally

    return, throw, continue, break 문을 finally 블록으로 정의하는 것을 금지합니다.

    이건 try~catch 구문에 의해 예기치 않은 동작을 방지할 수 있습니다.


    // NG

    try {

      return 1

    } catch (e) {

      return 2

    } finally {

      return 3

    }


    no-unsafe-negation

    관계 연산자에서 왼쪽 피연산자로 부정하는 것을 금지합니다.

    개발자 의도완 다르게 작동할 가능성이 있기 때문입니다.


    // NG

    if (!hoge in obj) {


    }

    if (!hoge instanceof Object) {


    }


    // OK

    if (!(hoge in obj)) {


    }

    if (!(hoge instanceof Object)) {


    }


    use-isnan

    NaN을 판정할 때에는 isNaN()을 사용해야 합니다.

    NaN으로 비교했을 경우 결과가 혼란스럽기 때문입니다.


    // NG

    if (hoge === NaN) {


    }


    // OK

    if (isNaN(hoge)) {


    }


    valid-jsdoc

    JSDoc 주석은 무조건 추가해야 합니다.


    // NG

    /**

     * Add two numbers.

     * @param {number} num The first number.

     * @returns The sum of the two numbers.

     */

    function add(num1, num2) {

      return num1 + num2;

    }


    // OK

    /**

     * Add two numbers.

     * @param {number} num1 The first number.

     * @param {number} num2 The second number.

     * @returns {number} The sum of the two numbers.

     */

    function add(num1, num2) {

      return num1 + num2;

    }


    valid-typeof

    typeof로 비교할 때 문자열이 유효한지 확인해야 합니다.


    // NG

    if (typeof hoge === 'undefiend') {


    }

    if (typeof hoge === 'stirng') {


    }


    // OK

    if (typeof hoge === 'undefined') {


    }

    if (typeof hoge === 'object') {


    }



    다음 편으로 이어집니다. [ESLint es6] JavaScript 이해하기 2 최선의 예제 이어 보세요.



    반응형