자 바스 크 립 트 의 실행 효율 을 높이 는 23 가지 실 용적 인 기교
8405 단어 자 바스 크 립 트 성능
이 브 라 우 저 는 V8 자 바스 크 립 트 엔진(V8 3.20.17.15)을 사용 합 니 다.
1.논리 기호&&또는|를 사용 하여 조건 판단
var foo = 10;
foo == 10 && doSomething(); // foo == 10 doSomething();
foo == 5 || doSomething(); // foo != 5 doSomething();
"||"도 함수 인자 의 기본 값 을 설정 할 수 있 습 니 다.
Function doSomething(arg1){
Arg1 = arg1 || 10; // arg1 Arg1=10
}
2.map()방법 으로 배열 을 옮 겨 다 니 기
var squares = [1,2,3,4].map(function (val) {
return val * val;
});
// [1, 4, 9, 16]
3.소수 자릿수 반올림
var num =2.443242342;
num = num.toFixed(4); // 2.4432
4.부동 소수점 문제
0.1 + 0.2 === 0.3 // is false
9007199254740992 + 1 // = 9007199254740992
9007199254740992 + 2 // = 9007199254740994
0.1+0.2 는 0.300000000000004 와 같은 데 왜 이런 상황 이 발생 했 습 니까?IEEE 754 기준 에 따 르 면 모든 자 바스 크 립 트 숫자 가 64 비트 바 이 너 리 에 있 는 것 은 부동 소수점 을 표시 한 다 는 것 을 알 아야 합 니 다.개발 자 는 toFixed()와 toPrecision()방법 으로 이 문 제 를 해결 할 수 있 습 니 다.5.for-in loop 을 사용 하여 대상 속성 을 검사 합 니 다.
아래 의 이 코드 는 주로 대상 속성 을 옮 겨 다 니 는 것 을 피하 기 위해 서 입 니 다.
for (var name in object) {
if (object.hasOwnProperty(name)) {
//
}
}
6.쉼표 연산 자
var a = 0;
var b = ( a++, 99 );
console.log(a); // a 1
console.log(b); // b 99
7.캐 시 변 수 를 계산 하거나 조회jQuery 선택 기 를 사용 한 경우 개발 자 는 DOM 요 소 를 캐 시 할 수 있 습 니 다.
var navright = document.querySelector('#right');
var navleft = document.querySelector('#left');
var navup = document.querySelector('#up');
var navdown = document.querySelector('#down');
8.isFinite()에 인 자 를 전달 하기 전에 검증
isFinite(0/0) ; // false
isFinite("foo"); // false
isFinite("10"); // true
isFinite(10); // true
isFinite(undifined); // false
isFinite(); // false
isFinite(null); // true !!!
9.배열 에서 마이너스 색인 피하 기
var numbersArray = [1,2,3,4,5];
var from = numbersArray.indexOf("foo") ; // from is equal to -1
numbersArray.splice(from,2); // will return [5]
인자 가 index Of()방법 에 전달 되 는 것 이 마이너스 인지 확인 합 니 다.10.(JSON 사용)직렬 화 와 역 직렬 화
var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} };
var stringFromPerson = JSON.stringify(person);
/* stringFromPerson is equal to "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */
var personFromString = JSON.parse(stringFromPerson);
/* personFromString is equal to person object */
11.eval()또는 Function 구조 함수 사용 피하 기eval()과 Function 구조 함 수 는 스 크 립 트 엔진 이 라 고 불 리 며,이 를 실행 할 때마다 원본 코드 를 실행 가능 한 코드 로 변환 해 야 합 니 다.이것 은 매우 비 싼 작업 입 니 다.
var func1 = new Function(functionCode);
var func2 = eval(functionCode);
12.with()방법 사용 피하 기전역 영역 에 with()를 사용 하여 변 수 를 삽입 하면 이름 과 같은 변수 이름 이 있 으 면 헷 갈 리 고 다시 쓰기 쉽 습 니 다.
13.배열 에서 for-in loop 사용 하지 않 기
이렇게 쓰 는 것 이 아니 라
var sum = 0;
for (var i in arrayNumbers) {
sum += arrayNumbers[i];
}
이렇게 하면 더욱 좋다.
var sum = 0;
for (var i = 0, len = arrayNumbers.length; i < len; i++) {
sum += arrayNumbers[i];
}
i 와 len 은 순환 중의 첫 번 째 문장 이기 때문에 매번 실례 화 할 때마다 한 번 씩 실행 합 니 다.이렇게 하면 아래 보다 더 빨리 실 행 됩 니 다.
for (var i = 0; i < arrayNumbers.length; i++)
왜?배열 길이 arrayn Numbers 는 loop 이 바 뀔 때마다 다시 계 산 됩 니 다.14.setTimeout()과 setInterval()방법 에 문자열 을 전달 하지 마 십시오.
이 두 가지 방법 에서 문자열 을 전달 하면 문자열 은 eval 처럼 다시 계산 합 니 다.이렇게 사용 하 는 것 이 아니 라 속도 가 느 려 집 니 다.
setInterval('doSomethingPeriodically()', 1000);
setTimeOut('doSomethingAfterFiveSeconds()', 5000);
반대로 이렇게 써 야 한다.
setInterval(doSomethingPeriodically, 1000);
setTimeOut(doSomethingAfterFiveSeconds, 5000);
15.긴 if/else 문 구 를 switch/case 문 구 를 사용 하여 대체 합 니 다.2 개 이상 의 케이스 가 있 으 면 switch/case 를 사용 하 는 속도 가 훨씬 빠 르 고 코드 가 더욱 우아 해 보 입 니 다.
16.수치 범 위 를 만 났 을 때 switch/casne 을 선택 할 수 있 습 니 다.
function getCategory(age) {
var category = "";
switch (true) {
case isNaN(age):
category = "not an age";
break;
case (age >= 50):
category = "Old";
break;
case (age <= 20):
category = "Baby";
break;
default:
category = "Young";
break;
};
return category;
}
getCategory(5); // "Baby"
17.대상 을 만 듭 니 다.대상 의 속성 은 주어진 대상 입 니 다.이러한 함 수 를 만 들 수 있 습 니 다.대상 을 만 들 수 있 습 니 다.이 대상 의 속성 은 주어진 대상 입 니 다.예 를 들 어 다음 과 같 습 니 다.
function clone(object) {
function OneShotConstructor(){};
OneShotConstructor.prototype= object;
return new OneShotConstructor();
}
clone(Array).prototype ; // []
18.HTML escaper 함수
function escapeHTML(text) {
var replacements= {"<": "<", ">": ">","&": "&", "\"": """};
return text.replace(/[<>&"]/g, function(character) {
return replacements[character];
});
}
19.하나의 loop 에서 try-catch-finally 사용 을 피한다.try-catch-finally 는 현재 범위 에서 실 행 될 때 새로운 변 수 를 만 듭 니 다.catch 를 실행 할 때 이상 대상 을 잡 으 면 변 수 를 할당 합 니 다.
이렇게 사용 하지 마 세 요:
var object = ['foo', 'bar'], i;
for (i = 0, len = object.length; i <len; i++) {
try {
// ,
}
catch (e) {
// ,
}
}
이렇게 사용 해 야 합 니 다:
var object = ['foo', 'bar'], i;
try {
for (i = 0, len = object.length; i <len; i++) {
// ,
}
}
catch (e) {
// ,
}
20.XML HttpRequests 에 timeouts 설정XHR 가 너무 오래 걸 리 면 링크(예 를 들 어 네트워크 문제)를 종료 하고 XHR 에 setTimeout()을 사용 하여 해결 할 수 있 습 니 다.
var xhr = new XMLHttpRequest ();
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
clearTimeout(timeout);
//
}
}
var timeout = setTimeout( function () {
xhr.abort(); // call error callback
}, 60*1000 /* 1 */ );
xhr.open('GET', url, true);
xhr.send();
또한,일반적으로 당신 은 동기 화 Ajax 호출 을 완전히 피해 야 합 니 다.21.웹 소켓 처리 시간 초과
일반적으로 웹 소켓 링크 를 만 들 때 서버 가 30 초 동안 방치 한 후에 링크 가 시간 을 초과 할 수 있 고 방치 한 후에 방화벽 도 시간 을 초과 할 수 있 습 니 다.
이러한 시간 초과 문 제 를 해결 하기 위해 서 는 정기 적 으로 서버 에 빈 메 시 지 를 보 낼 수 있 습 니 다.코드 에 두 개의 함 수 를 추가 할 수 있 습 니 다.하 나 는 링크 를 유지 하 는 데 사 용 됩 니 다.다른 하 나 는 링크 를 취소 하 는 데 사 용 됩 니 다.이런 방법 을 사용 하면 시간 초과 문 제 를 제어 할 것 입 니 다.
timeID 추가...
var timerID = 0;
function keepAlive() {
var timeout = 15000;
if (webSocket.readyState == webSocket.OPEN) {
webSocket.send('');
}
timerId = setTimeout(keepAlive, timeout);
}
function cancelKeepAlive() {
if (timerId) {
cancelTimeout(timerId);
}
}
keepAlive()방법 은 웹 소켓 링크 방법 onOpen()의 끝 에 추가 하고 cancelKeepAlive()방법 은 onClose()방법 아래 에 두 어야 합 니 다.22.가장 원시 적 인 조작 이 함수 호출 보다 빠르다 는 것 을 기억 하 라.
간단 한 임무 에 대해 서 는 함수 호출 이 아 닌 기본 조작 방식 으로 실현 하 는 것 이 좋다.
예컨대
var min = Math.min(a,b);
A.push(v);
기본 동작 방식:
var min = a < b ? a b;
A[A.length] = v;
23.인 코딩 시 코드 의 미관,읽 을 수 있 음 에 주의 하 세 요.자 바스 크 립 트 는 매우 좋 은 언어 입 니 다.특히 전단 엔지니어 에 게 자 바스 크 립 트 의 실행 효율 도 매우 중요 합 니 다.
우 리 는 자바 스 크 립 트 프로그램 을 작성 할 때 작은 세부 사항 에 주의 하고 자주 사용 하 는 실 용적 인 작은 기 교 를 습득 하면 프로그램 을 더욱 간편 하 게 하고 프로그램 실행 효율 을 높 일 수 있 습 니 다.