왜 우리는 자바스크립트를 이렇게 작성합니까?
지난 몇 년 동안 여기 Dev.to에서 많은 기사를 읽었고 다음과 같은 JavaScript를 계속 접하게 되었습니다.
const isPalindrome = string => {
let revString = [...string].reverse().join('')
const palindromeCheck = () => string === revString ? true : false
return palindromeCheck()
}
그리고 사람들이 왜 이런 코드 작성을 선호하는지 궁금하지 않을 수 없습니다. 내장 함수, 람다 및 기타 기능을 많이 사용하지만 원하는 것보다 읽기가 조금 더 어려울 수 있으며 실제로 수행하는 작업에 대해 생각하면 그다지 효율적이지 않습니다.
이것을 분해해보자:
Spread [...string] 함수를 사용하여 문자열을 문자 배열(메모리 할당)로 만든 다음 해당 배열을 뒤집습니다(적어도 컴파일러에서 이 작업이 수행되기를 바랍니다. 하지만 의심스럽습니다). 우리는 그 백업을 새로운 문자열로 결합합니다(메모리 할당).
두 번째로 기본적으로 단일 비교만 수행하는 하위 함수를 선언합니다. 이것은 말 그대로 아무 목적도 없는 것 같습니다.
저는 개인적으로 다음과 같이 작성합니다.
function isPalindrome(s) {
for (var i = 0; i < s.length / 2; ++i) {
if (s[i] != s[s.length - 1 - i]) {
return false;
}
}
return true;
}
분명히 몇 줄 더 있고 아마도 매우 "늙어 보이는"것 같지만 저는 늙었습니다. ). 문제는 이것이 더 빠르게 실행되고(약간) 제 생각에는 적어도 읽고 이해하기가 더 쉽습니다. 하지만 어쩌면 내가 미쳤을 수도 있습니다.
이 예도 같은 기사에서 두드러집니다.
const sum = (...args) => [...args].reduce((acc, num) => acc + num, 0)
물론, 내가 항상 피해야 한다고 생각하는 것, 즉 가독성이 좋지 않은 것을 피하는 더 읽기 쉬운 대안이 실제로 선행됩니다.
function sum() {
let total = 0
for (let num of arguments) {
total += num
}
return total
}
그것이 어떻게 작동하는지 스스로에게 물어볼 방법은 없습니다.
그러나 이 예제에서는 "새로운"재미있는 기능인 인수 배열에 "of"연산자를 사용합니다. 안타깝게도 jsbench.me를 사용하여 두 한 줄 버전을 비교하면 성능이 저하되고 두 번째 버전은 첫 번째 버전보다 92% 느린 것으로 보고됩니다. 이것은 아마도 한두 번 실행되는 함수에는 중요하지 않을 것입니다. 그러나 성능을 노골적으로 무시하는 이러한 종류의 패턴을 계속 따르면 결국에는 많은 문제에 직면하게 될 것입니다. 그 사람들의 ; ).
나는 구식 자바 스크립트를 다시 사용했습니다.
function sum() {
var sum = 0;
for (var i = 0; i < arguments.length; ++i) {
sum += arguments[i];
}
return sum;
}
매우 간단하고 매우 빠르며 우리의 오래된 한 줄 챔피언은 위의 기능보다 74% 느린 것으로 보고되었습니다.
반올림하여 세 번째 함수를 사용하겠습니다.
const captilizeAllWords = sentence => {
if (typeof sentence !== "string") return sentence
return sentence.split(' ')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ')
}
Split, Map, Slice, Join.. 여기에서 많은 배열 작업이 실행됩니다. 좀 더 기본적인 접근 방식을 시도해 보겠습니다.
function captilizeAllWords(s) {
var capitalize = true;
var returnValue = '';
for (var i = 0; i < s.length; ++i) {
var c = s[i];
if (c == ' ') {
capitalize = true;
} else if (capitalize) {
c = c.toUpperCase();
capitalize = false;
}
returnValue += c;
}
return returnValue;
}
이것은 훨씬 더 명시적입니다. 역시나 조금 더 길다. 그리고 다시 빨라졌습니다. JSBench는 여기에서 첫 번째 변형이 33% 더 느렸다고 보고합니다. 이 솔루션의 또 다른 이점은 실제로 탭이나 줄 바꿈 이후에 이 작업을 수행하려는 경우 달성하기 위해 코드에 대해 많은 생각을 하지 않아도 됩니다.
그것은 새로운 스타일의 기사에 대해 호언장담하는 이 오래된 개발자를 위한 것입니다. 바라건대 이것은 다른 것이 없다면 건전한 토론으로 이어질 수 있습니다 =).
야채를 먹고, 코드를 읽을 수 있게 만들고, BENCHMARK를 잊지 마세요!
Reference
이 문제에 관하여(왜 우리는 자바스크립트를 이렇게 작성합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/anders/why-do-we-write-javascript-like-this-3iob텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)