JS(ES6+) 개발자가 알아야 할 50가지 이상의 힌트 (4부)
오늘은 화살표 함수와 클래스에 대한 몇 가지 팁을 알려드리겠습니다.
1. 화살표 기능
인라인 콜백을 전달할 때와 같이 익명 함수를 사용해야 하는 경우 화살표 함수 표기법을 사용하십시오.
// bad
[1, 2, 3].map(function (x) {
const y = x + 1;
return x * y;
});
// good
[1, 2, 3].map((x) => {
const y = x + 1;
return x * y;
});
함수 본문이 부작용 없이 식을 반환하는 단일 문으로 구성된 경우 중괄호를 생략하고 암시적 반환을 사용합니다. 그렇지 않으면 중괄호를 유지하고 return 문을 사용하십시오.
// bad
[1, 2, 3].map((number) => {
const nextNumber = number + 1;
`A string containing the ${nextNumber}.`;
});
// good
[1, 2, 3].map((number) => `A string containing the ${number + 1}.`);
// good
[1, 2, 3].map((number) => {
const nextNumber = number + 1;
return `A string containing the ${nextNumber}.`;
});
// good
[1, 2, 3].map((number, index) => ({
}));
// No implicit return with side effects
function foo(callback) {
const val = callback();
if (val === true) {
// Do something if callback returns true
}
}
let bool = false;
// bad
foo(() => bool = true);
// good
foo(() => {
bool = true;
});
표현식이 여러 줄에 걸쳐 있는 경우 가독성을 높이기 위해 괄호로 묶습니다.
// bad
['get', 'post', 'put'].map((httpMethod) => Object.prototype.hasOwnProperty.call(
httpMagicObjectWithAVeryLongName,
httpMethod,
)
);
// good
['get', 'post', 'put'].map((httpMethod) => (
Object.prototype.hasOwnProperty.call(
httpMagicObjectWithAVeryLongName,
httpMethod,
)
));
명확성과 일관성을 위해 인수 주위에 항상 괄호를 포함합니다.
// bad
[1, 2, 3].map(x => x * x);
// good
[1, 2, 3].map((x) => x * x);
// bad
[1, 2, 3].map(number => (
`A long string with the ${number}. It’s so long that we don’t want it to take up space on the .map line!`
));
// good
[1, 2, 3].map((number) => (
`A long string with the ${number}. It’s so long that we don’t want it to take up space on the .map line!`
));
// bad
[1, 2, 3].map(x => {
const y = x + 1;
return x * y;
});
// good
[1, 2, 3].map((x) => {
const y = x + 1;
return x * y;
});
화살표 함수 구문(=>)과 비교 연산자(<=, >=)를 혼동하지 마십시오.
// bad
const itemHeight = (item) => item.height <= 256 ? item.largeSize : item.smallSize;
// bad
const itemHeight = (item) => item.height >= 256 ? item.largeSize : item.smallSize;
// good
const itemHeight = (item) => (item.height <= 256 ? item.largeSize : item.smallSize);
// good
const itemHeight = (item) => {
const { height, largeSize, smallSize } = item;
return height <= 256 ? largeSize : smallSize;
};
암시적 반환을 사용하여 화살표 함수 본문의 위치를 강제합니다.
// bad
(foo) =>
bar;
(foo) =>
(bar);
// good
(foo) => bar;
(foo) => (bar);
(foo) => (
bar
)
2. 클래스와 생성자
항상 클래스를 사용하십시오. 프로토타입을 직접 조작하지 마십시오.
// bad
function Queue(contents = []) {
this.queue = [...contents];
}
Queue.prototype.pop = function () {
const value = this.queue[0];
this.queue.splice(0, 1);
return value;
};
// good
class Queue {
constructor(contents = []) {
this.queue = [...contents];
}
pop() {
const value = this.queue[0];
this.queue.splice(0, 1);
return value;
}
}
왜요? instanceof를 중단하지 않고 프로토타입 기능을 상속하는 기본 제공 방법입니다.
// bad
const inherits = require('inherits');
function PeekableQueue(contents) {
Queue.apply(this, contents);
}
inherits(PeekableQueue, Queue);
PeekableQueue.prototype.peek = function () {
return this.queue[0];
};
// good
class PeekableQueue extends Queue {
peek() {
return this.queue[0];
}
}
메서드는 메서드 체이닝을 돕기 위해 이것을 반환할 수 있습니다.
// bad
Jedi.prototype.jump = function () {
this.jumping = true;
return true;
};
Jedi.prototype.setHeight = function (height) {
this.height = height;
};
const luke = new Jedi();
luke.jump(); // => true
luke.setHeight(20); // => undefined
// good
class Jedi {
jump() {
this.jumping = true;
return this;
}
setHeight(height) {
this.height = height;
return this;
}
}
const luke = new Jedi();
luke.jump()
.setHeight(20);
사용자 지정 toString() 메서드를 작성해도 괜찮습니다. 성공적으로 작동하고 부작용이 발생하지 않는지 확인하세요.
class Jedi {
constructor(options = {}) {
this.name = options.name || 'no name';
}
getName() {
return this.name;
}
toString() {
return `Jedi - ${this.getName()}`;
}
}
클래스는 지정되지 않은 경우 기본 생성자를 가집니다. 빈 생성자 함수 또는 부모 클래스에 위임하는 함수는 필요하지 않습니다.
// bad
class Jedi {
constructor() {}
getName() {
return this.name;
}
}
// bad
class Rey extends Jedi {
constructor(...args) {
super(...args);
}
}
// good
class Rey extends Jedi {
constructor(...args) {
super(...args);
this.name = 'Rey';
}
}
중복 클래스 멤버를 피하십시오.
// bad
class Foo {
bar() { return 1; }
bar() { return 2; }
}
// good
class Foo {
bar() { return 1; }
}
// good
class Foo {
bar() { return 2; }
}
외부 라이브러리나 프레임워크에서 특정 비정적 메서드를 사용해야 하는 경우가 아니면 클래스 메서드를 사용하거나 정적 메서드로 만들어야 합니다. 인스턴스 메서드가 된다는 것은 수신자의 속성에 따라 다르게 동작함을 나타내야 합니다.
// bad
class Foo {
bar() {
console.log('bar');
}
}
// good - this is used
class Foo {
bar() {
console.log(this.bar);
}
}
// good - constructor is exempt
class Foo {
constructor() {
// ...
}
}
// good - static methods aren't expected to use this
class Foo {
static bar() {
console.log('bar');
}
}
시간 내주셔서 감사합니다. 이 블로그가 여러분의 개발 과정에서 여러분의 자산이 되기를 바랍니다.
Reference
이 문제에 관하여(JS(ES6+) 개발자가 알아야 할 50가지 이상의 힌트 (4부)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/stormytalent/50-hints-jses6-developer-must-know-4th-part-4ecl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)