Functions

 

 

▽ 7.1 함수 스타일에 대해서는 별도의 스타일 가이드를 제공하지 않는다.

// type 1
function foo() {
  // ...
}

// type 2
const foo = function() {
  // ...
};

// type 3
const foo = function bar() {
  // ...
};

: Naver에서는 함수 스타일에 대해 차별을 두지 않지만, Airbnb의 경우 type3의 명명된 함수식을 권장합니다. 

 

 

▽ 7.2 즉시 실행함수는 함수를 괄호로 감싼다.

// bad
!function()) {
  console.log("Welcome to the Internet. Please follow me.");
}();

// bad - Airbnb권장
(function() {
  console.log("Welcome to the Internet. Please follow me.");
}());

// good - Naver권장
(function() {
  console.log("Welcome to the Internet. Please follow me.");
})();

: 즉시 실행함수(IIFE, Immediately Involked Function Expression)은 단 한번 호출되며, 재호출이 불가한 함수입니다.

IIFE를 사용하는 이유'전역변수 사용을 억제하기 위해서'입니다.

IIFE를 (괄호)로 감싸는 이유함수 객체를 생성하기 위함인데, 구체적인 이유는 다음과 같습니다.

  1. 보통 IIFE는 익명함수를 쓰는 것이 일반적인데, JavaScript엔진이 함수이름을 생략할 수 없어 에러가 발생됩니다.
  2. 함수이름을 넣더라도 JavaScript엔진이 암묵적으로 세미콜론(;)을 자동 삽입해 함수선언문이 끝나는 위치에 세미콜론이 추가돼 에러가 발생됩니다.
  3. 세미콜론이 추가되더라도 세미콜론 다음의 괄호는 함수 호출 연산자가 아닌 그룹 연산자로 해석돼 에러가 발생됩니다.

해당 내용에 대해서는 추후 즉시 실행함수에 대해 따로 정리해보겠습니다.

 

 

▽ 7.3 함수 이외의 블록(if, while 등) 안에서 함수를 선언하지 않는다.

// bad
let i;
for (i = 10; i; i--) {
    (function() { 
      return i; 
    })();
}

// bad
while(i) {
    let a = function() {
      return i;
    };
    a();
}

// good
const a = function() {};
let i;
for (i = 10; i; i--) {
    a();
}

: browser마다 함수 외의 블록 내에 있는 함수를 모두 다르게 해석하기 때문입니다.

 

 

▽ 7.4 Airbnb와 다르게 block 내의 함수선언에 대해서는 별도로 가이드 하지 않는다.

이하 Airbnb 내용

// Naver가 아닌 Airbnb 내용입니다.

// bad
if (currentUser){
	function test(){
    	console.log('Nope');
    }
}

// good
let test;
if (currentUser){
	test = () => {
    	console.log('Yup');
    }
}

 

 

▽ 7.5 절대로 파라미터에 arguments를 지정하지 않는다. 이것은 함수 스코프에 전해지는 arguments 오브젝트의 참조를 덮어버린다.

// bad
function nope(name, options, arguments) {
  // ...stuff...
}

// good
function yup(name, options, args) {
  // ...stuff...
}

: JavaScript 함수에는 '인수객체(arguments)'라는 '내장객체'가 있습니다. 인수객체에는 함수가 호출될 때 사용된 인수 배열이 포함됩니다. 즉 이미 내장객체에 arguments가 있으니 파라미터로 쓸 수 없다는 뜻입니다.

 

 

▽ 7.6 절대 arguments를 이용하지 않는다. 대신에 rest 파라미터(...)를 이용한다.

// bad
function concatenateAll() {
  const args = Array.prototype.slice.call(arguments);
  return args.join("");
}

// good
function concatenateAll(...args) {
  return args.join("");
}

: rest 파라미터는 원하는 값에 대해 명확히 표현할 수 있습니다. 하지만 인수객체(arguments)를 쓴다면 오류 유발 가능성이 커집니다.

 

 

▽ 7.7 함수의 파라미터를 재정의하지 않는다. 대신 default 파라미터를 이용한다.

// really bad
function handleThings(opts) {
  opts = opts || {};
  // ...
}

// still bad
function handleThings(opts) {
  if (opts === void 0) {
    opts = {};
  }
  // ...
}

// good
function handleThings(opts = {}) {
  // ...
}

: default parameter(기본 매개변수)는 함수에 전달된 파라미터 값이 'undefined'거나 '값이 없을 때, 초기화 설정된 값'을 의미합니다.

 'void'은 관용적으로 사용하는 JavaScript 연산자입니다.

  • 'undefined' 원시값을 얻기 위해 void 0 또는 void(0)을 사용합니다.
  • void는 오버라이드 되지 않고 void 0은 항상 undefined를 리턴합니다.
  • undefined는 예약어가 아니라서 어떤 값이든 될 수 있습니다. (ex. var undefined = 0;    // 0)

 

 

▽ 7.8 side effect를 유발하는 default 파라미터의 이용을 피한다.

var b = 1;
// bad
function count(a = b++) {
  console.log(a);
}
count();  // 1
count();  // 2
count(3); // 3
count();  // 3

 

 

▽ 7.9 항상 default 파라미터는 뒤쪽에 둔다.

// bad
function handleThings(opts = {}, name) {
  // ...
}

// good
function handleThings(name, opts = {}) {
  // ...
}

 

 

▽ 7.10 절대 새 함수를 작성하기 위해 Function constructor를 이용하지 않는다.

// bad
var add = new Function("a", "b", "return a + b");

// still bad
var subtract = Function("a", "b", "return a - b");

: 이런 방식으로 함수를 만들면 취약성을 여는 eval()과 유사한 문자열처럼 처리됩니다. eval()에 관한 글 보기

 

 

▽ 7.11 익명함수는 function과 괄호 사이에 공백이 없다. 기명 함수(named function)는 함수 이름과 괄호 사이에 공백이 없다. async arrow function인 경우 async와 arrow function 사이에 공백이 있다.

// bad
const f = function () {};
const g = function a (){};
const h = async(v,i) => {};

// good
const x = function() {};
const y = function a() {};
const z = async (v,i) => {};

: 이는 코드를 일관성 있게 보이게 하며, 이름을 추가하거나 제거할 때 공백을 추가하거나 제거할 필요가 없어 관리가 편합니다.

 Naver에서는 async와 arrow function 사이에 공백도 추가했네요.

 

 

▽ 7.12 가급적 mutate parameter는 사용하지 않는다. 하지만, 필요에 의해서는 주의하여 사용한다.

// 권장하지 않음.
function f1(obj){
	obj.key = 1;
}

: 함수의 파라미터로 전달된 개체를 변형(mutate)하면, caller의 변수에 side effects가 발생할 수 있기 때문입니다.

 

 

▽ 7.13 파라미터를 재할당하지 않는다. 단, 파라미터의 속성에 대해서는 재할당이 가능하다.

// bad
function f1(a) {
  a = 1;
  // ...
}

// bad
function f2(a) {
  if (!a) { a = 1; }
  // ...
}


// good
function f3(a) {
  const b = a || 1;
  // ...
}

// good
function f4(a) {
  if (!a) { a.b = 1; }
  // ...
}

: Airbnb에서는 f4 함수에서 보이는 파라미터 속성값의 재할당 또한 금하고 있습니다.

 

 

▽ 7.14 가변함수를 호출할 때는 spread 연산자(...)를 사용한다.

// bad
const x = [1, 2, 3, 4, 5];
console.log.apply(console, x);

// good
const x = [1, 2, 3, 4, 5];
console.log(...x);

// bad
new (Function.prototype.bind.apply(Date, [null, 2016, 8, 5]));

// good
new Date(...[2016, 8, 5]);

: spread 연산자를 사용하면, 더 깔끔하고 문맥을 제공하지 않아도 됩니다.

 

 

▽ 7.15 함수의 정의가 멀티라인인 경우, 오브젝트와 같은 스타일 가이드를 따른다.

// bad
function foo(bar,
             baz,
             quux) {
  // ...
}

// good
function foo(
  bar,
  baz,
  quux,
) {
  // ...
}

// bad
console.log(foo,
  bar,
  baz);

// good
console.log(
  foo,
  bar,
  baz,
);

 

 

 예상하다시피 JavaScript Function에 대한 컨벤션은 길고, 사전지식이 많이 필요한 것 같습니다. 위 내용에서 궁금한 점도 많이 생겼으니 추후 자세하게 다뤄볼 주제들도 많네요. 다음 주제는 Arrow Function(화살표 함수)입니다.

 

 

naver github STYLE_GUIDE.md

 

 

사전지식

  • JavaScript에서 텍스트 데이터는 문자열(String)로 저장됩니다.
  • 문자열은 작은 따옴표(' '), 큰 따옴표(" "), 백틱(` `)으로 묶을 수 있습니다. - mac 에서 백틱은 [Opt + 원화] 입니다.
  • 특수문자를 사용할 때는 escape문자( \ )를 사용합니다.

Strings


 

 ▽ 6.1 따옴표는 쌍따옴표를 사용한다. 이스케이프한 경우는 예외로 홑따옴표를 사용할 수 있다.

// bad
var key = 'naver';
var obj = {
  'key': '1'
}

// good
var key = "naver";
var obj = {
  "key": "1"
}

 

 

 ▽ 6.2 문자열은 100자를 넘지 않는다. 100자가 넘는 긴 물자열인 경우 줄바꿈시 escape 문자()를 사용하지 않는다. escape문자 대신 +연산자를 이용한다. ES6의 template strings가 사용 가능한 환경에서는 6.3룰을 적용한다.

// bad
const errorMessage = 'This is a super long error that was thrown because \
of Batman. When you stop to think about how Batman had anything to do \
with this, you would get nowhere \
fast.';

// good
const errorMessage = "This is a super long error that was thrown because " +
  "of Batman. When you stop to think about how Batman had anything to do " +
  "with this, you would get nowhere fast.";

 

 

 ▽ 6.3 프로그램에서 문자열을 생성하는 경우는 문자열 연결이 아닌 template strings를 이용한다.

// bad
function sayHi(name) {
  return "How are you, " + name + "?";
}

// bad
function sayHi(name) {
  return ["How are you, ", name, "?"].join();
}

// good
function sayHi(name) {
  return `How are you, ${name}?`;
}

: ES6에서는 템플릿 리터럴이라는 새로운 문자열 표기법을 도입했습니다.

  • 따옴표와 다르게 백틱( ` )을 이용합니다. -> 연산자 없이 간단히 문자열을 삽입할 수 있습니다.
  • escape를 사용하지 않아도 됩니다. ex. \n
  • 문자열 내부에 포함식을 사용할 수 있습니다. 위 예제와 같이.
  • 멀티라인도 가능합니다.

 

 

 ▽ 6.4 절대로 eval()을 사용하지 않는다.

: eval()이라는 JavaScript의 내장함수는 사용을 절대 금하고 있습니다. 이유가 뭘까요?

  • eval()은 JS파일로부터 인자로 받은 코드 중 문자열이 있으면 이를 수치화 합니다.(문자열->숫자)
  • 이 때, 인자로 받은 코드를 caller의 권한으로 수치화합니다. 관리자 권한으로 실행과 같은 느낌이죠.
  • 위의 이유로 바이러스에 취약하고, 제 3자가 eval()이 호출된 위치의 스코프 추적이 가능합니다.
  • JS 파싱단계에서 JS파일의 문자열을 발견하면 수행합니다.
  • 위 단계에서 인터프리터를 사용하여 다른 대안보다 느리고 비효율적으로 동작합니다.

결국 eval()이 취약하다는 점에서 사용을 금하고 있는 것 같습니다. (아마도!)

 

 

 ▽ 6.5 문자열에 불필요한 escape 문자를 사용하지 않는다.

// bad
const foo = "\'this\' \i\s \'quoted\'";

// good
const foo = "\"this\" is 'quoted'";
const foo = `my name is '${name}'`;

 

 문자열 또한 그렇게 많이 언급할 부분은 없는 것 같습니다. 그래도 eval()을 사용하지 않아야겠다! 정도 얻은 것 같습니다.

추후 escape나 백틱, string 내장함수들에 대해서도 정리하는 시간을 가져야겠습니다.

 

 

naver github STYLE_GUIDE.md

 

 

Destructuring


 

 네이버 컨벤션은 Destructuring에 대해 Airbnb와 다르게 별도의 가이드를 제공하지 않습니다. 하지만 Airbnb의 Destructuring conventions에도 좋은 점이 많이 보여 정리하였습니다.

 JavaScript의 Destructuring 개념에 대해 알고싶으시다면 이전 글을 참고해주시기 바랍니다.

 

Airbnb Conventions

 

▽ 5.1 object의 여러 프로퍼티에 접근하거나 사용하기 위해 destructuring을 사용합니다.

// bad
function getFullName(user) {
  const firstName = user.firstName;
  const lastName = user.lastName;

  return `${firstName} ${lastName}`;
}

: Destructuring을 진행하지 않고 각각의 변수를 선언합니다.

// good
function getFullName(user) {
  const { firstName, lastName } = user;
  return `${firstName} ${lastName}`;
}

// best
function getFullName({ firstName, lastName }) {
  return `${firstName} ${lastName}`;
}

: Destructuring의 다음과 같은 장점을 사용하기 위해서입니다.

  • 해당 프로퍼티에 대한 임시 참조를 생성합니다 : 해당 프로퍼티 사용 시, 블록 전체를 읽어낼 필요가 없어 속도가 향상됩니다.
  • 개체에 대한 반복적인 접근(Access)를 방지합니다 : 반복적인 엑세스는 더 많은 반복적인 코드를 생성해 실수를 유발합니다.

 

 ▽ 5.2 배열 Destructuring을 사용합니다.

const arr = [1, 2, 3, 4];

// bad
const first = arr[0];
const second = arr[1];

// good
const [first, second] = arr;

 

▽ 5.3 반환 값이 여러개라면, Array Destructuring보다 Object Destructuring이 권장됩니다.

// bad
function processInput(input) {
  // then a miracle occurs
  return [left, right, top, bottom];
}

// 이 경우 반환 데이터의 순서를 고려해야됩니다.
const [left, __, top] = processInput(input);
// good
function processInput(input) {
  // then a miracle occurs
  return { left, right, top, bottom };
}

// 원하는 데이터만 가져올 수 있습니다.
const { left, top } = processInput(input);

 

naver github STYLE_GUIDE.md

 

Arrays


 

 ▽ 4.1 배열을 작성 할 때는 리터럴 구문을 사용한다.

// bad
const items = new Array();

// good
const items = [];

 

 

 ▽ 4.2 아이템을 배열에 추가하는 경우, 직접 배열에 항목을 대입하지 말고 Array#push를 이용한다.

const someStack = [];

// bad
someStack[someStack.length] = "abracadabra";

// good
someStack.push("abracadabra");

 

 

 ▽ 4.3 배열을 복사할 때는 배열의 spread 연산자...를 이용한다.

// bad
const len = items.length;
const itemsCopy = [];
let i;

for (i = 0; i < len; i++) {
  itemsCopy[i] = items[i];
}

// good
const itemsCopy = [...items];

Airbnb 4.4 ~ 4.7

4.4 반복 가능한 객체를 배열로 변환 시, Array.from보다 spread ...의 사용을 권장합니다.

4.5 Array.from은 배열과 같은 객체를 배열로 변환하는 데 사용합니다.

4.6 spread ... 대신 Array.from을 사용하면 중간배열이 생성되지 않아 반복 가능한 항목에 매핑할 수 있습니다.

4.7 배열 메서드 콜백에서 반환문을 사용합니다. 함수 본문이 단일문으로 구성된 경우 반환을 생략해도 됩니다.

airbnb javascript conventions


 

 ▽ 4.8 배열이 멀티 라인인 경우, 배열의 시작(before)과 끝(after)은 개행한다.

// bad
const arr = [
  [0, 1], [2, 3], [4, 5],
];

const objectInArray = [{
  id: 1,
}, {
  id: 2,
}];

const numberInArray = [
  1, 2,
];

// good
const arr = [[0, 1], [2, 3], [4, 5]];

const objectInArray = [
  {
    id: 1,
  },
  {
    id: 2,
  },
];

const numberInArray = [
  1,
  2,
];

 

 확실히 Array Conventions에 대해서는 언급할 부분이 별로 없습니다. 직접적인 아이템 추가를 지양하고, 조금 더 보기 쉽도록 spread를 권장하는 모습을 보입니다.

 

 

naver github STYLE_GUIDE.md

 

Object (객체)


 

▽ 3.1 Object(객체)를 작성할 때는, 리터럴 구문을 사용한다.

// bad
const item = new Object();

// good
const item = {};

 : 객체는 new object(), Object.create(), literal표기법을 사용해 초기화할 수 있습니다. 여기서는 리터럴 표기법을 사용합니다.

 

 

▽ 3.2 동적 프로퍼티명을 갖는 오브젝트를 작성할 때, 계산된 프로퍼티명(computed property names)을 이용한다.

function getKey(k) {
  return `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
};

: 계산된 프로퍼티명은 JS Object의 프로퍼티 이름을 동적으로 설정할 수 있게 만들어주는 ES6의 기능입니다. 유효한 값을 반환하는 변수나 함수를 [대괄호] 안에 작성하여 객체의 프로퍼티를 동적으로 추가할 수 있습니다. 위 예시와 같이 변수 뿐 아니라 함수를 대괄호에 작성해 객체 프로퍼티를 추가할 수 있습니다. 이런 방식을 사용한다면 Object의 모든 프로퍼티를 한 블록 내에서 정의할 수 있습니다.

 

 

▽ 3.3 메서드의 단축구문을 사용한다.

// bad
const atom = {
  value: 1,

  addValue: function (value) {
    return atom.value + value;
  },
};

// good
const atom = {
  value: 1,

  addValue(value) {
    return atom.value + value;
  },
};

: 메서드 단축구문 또한 ES6에 도입되었습니다. 객체 초기자(initializer)에 메서드 정의를 위한 단축구문입니다. function은 메서드 정의에서 더 이상 필요없게 되었습니다.

 

 

▽ 3.4 속성의 단축구문을 사용한다.

const lukeSkywalker = "Luke Skywalker";

// bad
const obj = {
  lukeSkywalker: lukeSkywalker,
};

// good
const obj = {
  lukeSkywalker,
};

: 위 예시와 같이 객체의 속성값이 변수로 할당되었다면, 변수 이름만 적어주면 됩니다.

 

 

▽ 3.5 속성의 단축 구문은 오브젝트 선언의 시작 부분에 그룹화한다.

const anakinSkywalker = "Anakin Skywalker";
const lukeSkywalker = "Luke Skywalker";

// bad
const obj = {
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  lukeSkywalker,
  episodeThree: 3,
  mayTheFourth: 4,
  anakinSkywalker,
};

// good
const obj = {
  // 단축 속성 구문 - 시작
  lukeSkywalker,
  anakinSkywalker,
  // 단축 속성 구문 - 끝
  episodeOne: 1,
  twoJediWalkIntoACantina: 2,
  episodeThree: 3,
  mayTheFourth: 4,
};

: 속성의 단축구문을 시작구문에 그룹화하면, 어떤 프로퍼티가 단축구문을 이용하고 있는지 알기 편합니다.


 (Airbnb와 다른 부분 시작)

 

▽ 3.6 속성명이 키워드(default, if, ...)일 경우에는 꼭 따옴표를 붙인다. 또한, -문자와 같이 속성명으로 지정할수 없는 경우에는 꼭 따옴표를 붙인다.

// bad
const bad = {
  foo: 3,
  default: 20,
  data-blah: 5
};

// good
const good = {
  foo: 3,
  "default": 20,
  "data-blah": 5,
  10: "naver"
};

 

 

▽ 3.7 hasOwnPropertypropertyIsEnumerableisPrototypeOf 와 같은 Object.prototype 메서드를 직접적으로 사용하지 않는다.

// 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.
/* or */
import has from "has";
// ...
console.log(has.call(object, key));

: JS에서 객체를 상속하기 위해 프로토타입 방식을 사용합니다. 한편,  hasOwnPropertypropertyIsEnumerableisPrototypeOf 와 같은 builtin 메서드는 객체에서 직접호출하거나 Object.prototype을 사용해 호출합니다. 3.7 항목은 Object.prototype를 사용해 호출할 때 직접적인 사용을 지양하도록 합니다. 직접적으로 사용할 경우 발생될 문제점은 다음과 같습니다.

  • Object.create(null) : null로 객체를 생성하면 Object.prototype을 상속받지 않습니다.
  • builtin 방식으로 제공되는 메서드는 키를 이미 가진 채로 제공되는데, 객체와 builtin 메서드에 같은 이름을 가진 키가 있다면 잘못된 결과를 반환할 수 있습니다.

 

▽ 3.8 얕은 복사(shallow-copy)를 하기 위해서 Object.assign보다는 spread 연산자(...)를 선호한다. 오브젝트에서 몇몇 속성을 제거한 새로운 오브젝트를 얻고자 할때는 rest 파라미터(...)를 사용한다.

// 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 }

: JS에는 얕은 복사(Shallow-copy)와 깊은 복사(Deep-copy)가 있습니다. 

  • 얕은 복사 : 객체를 직접 대입함. 참조에 의한 할당. 원본과 복사본은 같은 데이터주소를 가지고 있어, 한쪽만 변경돼도 둘 다 변경된다.
  • 깊은 복사 : 새로운 객체의 프로퍼티만 복사. 원복과 복사본은 다른 데이터주소를 가지고 있다. 

Object.assign는 얕은 복사, spread는 깊은 복사(1depth 한정)가 이루어집니다. spread는 장황하지 않고, 네이티브 지원이 없는 환경에서도 폴리필이 필요하지 않습니다.(ex. BABEL)

 

naver github STYLE_GUIDE.md

 

 

Object 부분은 다른 컨벤션 부분보다 기초지식이 없으면 이해하기 어렵다는 생각이 들었습니다. 이 페이지에 나온 부분들은 추후 따로 다뤄보도록 하겠습니다. 다행이도 다음 Array부분부터는 좀 더 친숙한 부분이 많네요...ㅎㅎ

References


 이 부분은 변수 선언(참조)에 대한 내용입니다.

 

  2.1 변수 선언은 가급적 const를 사용하고, var는 사용하지 않는다.

//bad
var a = 1;
var b = 2;

//good
const a = 1;
const b = 2;

: const를 사용해야 참조를 재할당할 수 없으므로, 버그발생 및 코드난독을 해소할 수 있습니다.

 

 

 ▽ 2.2 참조를 재할당 해야된다면 var 대신 let을 사용한다.

//bad
var count = 1;
if (true) {
	count += 1;
}

//good, use the let!
let count = 1;
if (true) {
	count += 1;
}

 : let은 블록범위, var는 함수범위이기 때문입니다.

 

 

  2.3 let과 const는 선언된 블록 안에서만 존재하는 블록 스코프이다.

// const와 let은 선언된 블록의 안에서만 존재한다.
{
	let a = 1;
	let b = 1;
	let c = 1;
}
console.log(a);
console.log(b);
console.log(c);
//결과
ReferenceError
ReferenceError
1

 

 

naver github STYLE_GUIDE.md

 

사전지식

  • 데이터 타입에는 기본형(Primitive)과 참조형(References=Non-Primitive)이 있습니다.
  • JavaScript는 object를 제외한 모든 것이 Primitive한 성격을 가지고 있습니다.
  • Primitive type : 데이터의 실제 값을 할당합니다.
  • Reference type : 데이터의 위치 값을 할당합니다.

Primitives Type


  • data가 변수에 저장될 때, 고정된 크기(Byte)로 저장됩니다.
  • 변수 선언, 초기화, 할당 시 메모리 영역에 직접 접근합니다.
  • 종류는 string, number, boolean, null, undefined, symbol, bigint가 있습니다.
const foo = 1;
let bar = foo;

bar = 9;

console.log(foo, bar);

 ▽ 1.1 기본형은 그 값을 직접 조작한다.

//결과
1, 9

 

Reference Type (Complex)


  • data의 크기가 정해져 있지 않고, 변수에 할당될 때 데이터에 대한 참조만 저장됩니다.
  • 종류로는 object, array, function이 있습니다.

  1.2 참조형(Complex)는 참조를 통해 값을 조작한다.

const foo = [1, 2];
const bar = foo;

bar[0] = 9;

console.log(foo(0), bar[0]);
//결과
9, 9

 

naver github STYLE_GUIDE.md

코딩 컨벤션(Coding Conventions) : 코드를 어떻게 표기할 것인지에 대한 규약 (a.k.a. 스타일 가이드)

 

 

 프로그래머마다 코드를 짜는 스타일은 다양합니다만, 나 혼자만의 프로젝트가 아닌 실무에서는 협업이 필수적입니다. 

여러 사람이 수천 줄의 코드를 짜고, 리뷰하고 보수합니다. 그런데 수백, 수천만의 사람이 어떠한 규칙도 없이 코드를 짜게 되면 어떻게 될까요? 

 

 사람들은 점차 유지보수와 코드리뷰에 어려움을 겪었습니다. 그래서 '코드를 이렇게 작성하자' 라는 취지로 질서를 만들기 시작했습니다. 현재는  변수 이름을 어떻게 작성해야 할 지부터 하다못해 중괄호의 위치 등 세세한 부분까지 합의된 가이드를 정립했고, 이를 코딩(코드) 컨벤션이라고 부르기로 했습니다. 물론 70억명이 되는 인구를 통합할 수 없기에 기업별로 조금씩 다른 부분은 있습니다. (그래서 좋은 기업의 가이드를 찾는 것이 좋습니다. 그리고 규칙을 무조건적으로 따를 것이 아니라 좋은 제안이라고 생각하는 자세가 필요합니다.)

 


 

 NAVER JS Convention
https://github.com/naver/eslint-config-naver/blob/master/STYLE_GUIDE.md
 

GitHub - naver/eslint-config-naver: Naver JavaScript Coding Conventions rules for eslint

Naver JavaScript Coding Conventions rules for eslint - GitHub - naver/eslint-config-naver: Naver JavaScript Coding Conventions rules for eslint

github.com

 NAVER는 한국 최고의 IT회사 중 하나이며, 코딩 컨벤션을 github에 공개하고 있습니다. 실제로 Airbnb의 가이드를 거의 따르고 있다고 명시해 놓았는데, Airbnb는 영어로 컨벤션을 제공하다보니 익히는 데 어려움이 있었습니다. 한국에서 자바스크립트를 공부한다면 NAVER 컨벤션을 공부해보는 것도 좋을 것 같다는 생각이 들었습니다.

 

 

앞으로 JS 컨벤션에 대해 해부해보겠습니다.

+ Recent posts