github에 올라와있는 https://github.com/airbnb/javascript 를 번역하고 약간의 해석을 덧붙인 글입니다.
객체를 만들 때, 리터럴 사용하기.
// bad
const item = new Object();
// good
const item = {};
리터럴 구문: 중괄호({}
)를 사용해 새 객체를 작성하는 것을 객체 리터럴 생성이라고 한다.
찾아보니 객체를 생성할 때, 위의 방법 중 어느 것을 사용해도 큰 성능차이가 나지 않지만, {}가 더 간결하기에 사람들은 주로 리터럴 방식을 많이 사용한다고 한다.
동적으로 넣을 수 있는 키 값은 객체를 생성할 때, 한번에 같이 생성하기.
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,
};
코드만 보면 이해가 잘 가지 않지만, 출력 결과를 보면 금방 이해할 수 있다.
{a key named enabled: true,
id: 5,
name: "San Francisco"}
출력 결과는 위와 같다. "a key named enabled" 에서 enabled는 getKey
함수를 통해 우리가 동적으로 값을 넣은 부분이다.
이와 같은 행동을 할 때, 굳이 복잡하게 따로 생성하지 말고, 객체를 생성해줄 때, 한 번에 만들라는 뜻을 담고 있다.
객체 메서드를 단축 표기법을 사용해 만들자.
// bad
const atom = {
value: 1,
addValue: function (value) {
return atom.value + value;
},
};
// good
const atom = {
value: 1,
addValue(value) {
return atom.value + value;
},
};
단축 표기법(shorthand notation): 메서드를 정의할 때 function 키워드
와 콜론:
을 생략하는 방식이다.
단축 표기법을 사용하면, 객체의 메서드를 더 간결하게 만들고, 확인할 수 있다.
프로퍼티 값 또한 단축 표기법을 사용하자.
const lukeSkywalker = 'Luke Skywalker';
// bad
const obj = {
lukeSkywalker: lukeSkywalker,
};
// good
const obj = {
lukeSkywalker,
};
객체의 키와 값의 이름이 동일하다면 뒤에 있는 : 값
부분을 생략할 수 있다.
함수에서도 이와 같이 활용될 수 있다.
function userInfo(name, age) {
return {
name,
age: age,
};
}
let user = userInfo("Jamong", 22);
console.log(user);
참고로, 단축 표기법과 일반 표기법은 함께 사용하는 것이 가능하다.
단축 표기법을 통해 단축된 프로퍼티들을 한 곳에 모아둬라.
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,
};
바로 위의 케이스에서 "단축 표기법과 일반 표기법은 함께 사용하는 것이 가능하다"라고 했는데,
만약 같이 사용하는 경우 bad case처럼 단축 표기법과 일반 표기법이 뒤죽박죽 섞이게 된다.
이를 방지하기 위해, 그리고 조금 더 깔끔히 관리하기 위해서,
단축 표기법은 단축 표기법끼리, 일반 표기법은 일반 표기법끼리 묶어서 관리하는게 좋다.
따움표로 만들어진 프로퍼티들은 꼭 필요한 경우(효력 없는 속성)에만 사용하자.
// bad
const bad = {
'foo': 3,
'bar': 4,
'data-blah': 5,
};
// good
const good = {
foo: 3,
bar: 4,
'data-blah': 5,
};
먄약, 객체의 키 값으로 -를 따움표 없이 data-blash: 5
와 같이 사용한다면, 다음과 같은 오류가 나온다.
=> Uncaught SyntaxError: Unexpected token '-'
따라서, 이런 어쩔 수 없는 경우를 제외하고는 주관적으로 읽기가 더 쉬운(따움표가 없는) 방식을 사용하는 것을 권장하고 있다.
하지만 ESLint에서는 따움표를 쓰면 전부 다 쓰고, 따움표를 쓰지 않는다면 모두 쓰지 않는 일관된방식을 추천하는데 둘 중 하나의 방법을 선택해 사용해도 좋을 것 같다.
Object.prototype에서 builtin으로 제공되는 메서드를 객체에서 직접적으로 호출하지 마라.
(ex. hasOwnProperty, propertyIsEnumerable, isPrototypeOf)
// 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));
1) 객체에서 직접 호출
2) Object.ptototype을 통한 호출
2가지 방법 모두 true를 반환한다.
const user = { name: 'joah' }
user.hasOwnProperty('name'); // 1) true
Object.prototype.hasOwnProperty.call(obj, 'name'); // 2) true
하지만, Object.prototype에서 builtin(내장되어 있는) 메서드를 객체에서 직접적으로 호출하면 2가지의 문제가 생긴다.
const user = Object.create(null);
user.name = 'jamong';
user.hasOwnProperty('jamong'); // 1) object.hasOwnProperty is not a function
Object.prototype.hasOwnProperty.call(obj, 'name'); // 2) true
const user = {
name: 'jamong',
hasOwnProperty: 'yes',
}
user.hasOwnProperty('name'); // 1) Uncaught TypeError: user.hasOwnProperty is not a function
Object.prototype.hasOwnProperty.call(user,'name'); // 2) true
위와 같이 builtin으로 주어지는 hasOwnProperty
메서드를 객체에서 키의 이름으로써 사용했다면, 단순히 객체에서 직접 호출하는 경우 오류가 발생한다.
따라서 2가지의 이유에 의해 객체의 builtin 메서드들은 Object.prototype를 사용해 호출해야 한다.
참고: https://yeon-js.tistory.com/8
참고: https://ko.javascript.info/object