길에서 보다 -- 자 바스 크 립 트

자 바스 크 립 트 기교가 45 수
http://chensd.com/2015-01/45-useful-javascript-tips-tricks-and-best-practices.html JavaScript 는 전 세계 에서 가장 우수한 프로 그래 밍 언어 로 웹 개발, 모 바 일 애플 리 케 이 션 개발 (PhoneGap, Appcelerator), 서버 개발 (Node. js 와 Wakanda) 등에 사용 할 수 있다.자 바스 크 립 트 는 많은 초보 자 들 이 프로 그래 밍 세계 에 발 을 들 여 놓 은 첫 번 째 언어 이다.브 라 우 저의 간단 한 알림 상 자 를 표시 할 수도 있 고, nodebot 이나 nodruino 를 통 해 로봇 을 제어 할 수도 있 습 니 다.구조 가 뚜렷 하고 성능 이 효율 적 인 자 바스 크 립 트 코드 를 작성 할 수 있 는 개발 자 는 현재 채용 시장 에서 가장 인기 있 는 사람 이 되 었 다.
이 글 에서 저 는 자바 스 크 립 트 의 기술, 비결 과 가장 좋 은 실천 을 공유 할 것 입 니 다. 몇 개 를 제외 하고 브 라 우 저의 자바 스 크 립 트 엔진 이 든 서버 의 자바 스 크 립 트 해석 기 든 모두 적 용 됩 니 다.본 논문 의 예제 코드 는 구 글 크롬 30 최신 판 (V8 3.20.17.15) 에서 의 테스트 를 통과 했다.
1. 처음으로 변수 에 값 을 부여 할 때 var 키워드 변 수 를 사용 하여 설명 하지 않 고 직접 값 을 부여 해 야 합 니 다. 기본 값 은 새로운 전역 변수 로 서 전역 변 수 를 사용 하지 않도록 해 야 합 니 다.2. 사용 = = = 대체 = =
= = 화! =조작 부 호 는 필요 한 상황 에서 데이터 형식 을 자동 으로 변환 합 니 다.그러나 = = = 화! = =아 닙 니 다. 값 과 데이터 형식 을 동시에 비교 할 수 있 습 니 다. 이것 은 = 와! =빨리.
[10] === 10    // is false
[10]  == 10    // is true
'10' == 10     // is true
'10' === 10    // is false
[]   == 0     // is true
[] ===  0     // is false
'' == false   // is true but true == "a" is false
'' === false  // is false

3. underfined, null, 0, false, NaN, 빈 문자열 의 논리 적 결 과 는 모두 false 4 이 고 줄 끝 에 분 호 를 사용 하 는 실천 에서 분 호 를 사용 하 는 것 이 좋 습 니 다. 쓰 는 것 을 잊 어도 괜 찮 습 니 다. 대부분의 경우 자 바스 크 립 트 해석 기 는 자동 으로 추 가 됩 니 다.분 호 를 왜 사용 하 는 지 에 대해 서 는 자바 스 크 립 트 의 분점 에 대한 진실 을 참고 할 수 있 습 니 다.5. 대상 구조 기 사용
function Person(firstName, lastName){
   this.firstName =  firstName;
   this.lastName = lastName;
}
var Saad = new Person("Saad", "Mousliki");

6. typeof, instanceof, contructor 사용 조심
type: of: JavaScript 1 원 연산 자 는 문자열 형식 으로 변수의 원본 형식 을 되 돌려 줍 니 다. type: of null 도 object 를 되 돌려 줍 니 다. 대부분의 대상 유형 (배열 Array, 시간 날짜 등) 도 object 를 되 돌려 줍 니 다.
contructor: 내부 원형 속성, 코드 를 통 해 다시 쓸 수 있 습 니 다.
instanceof: JavaScript 연산 자 는 프로 토 타 입 체인 의 구조 기 에서 검색 하고 찾 으 면 true 로 돌아 갑 니 다. 그렇지 않 으 면 false 로 돌아 갑 니 다.
var arr = ["a", "b", "c"];
typeof arr;   //    "object" 
arr instanceof Array // true
arr.constructor();  //[]

` 7. 자체 호출 함수 함 수 를 사용 하여 생 성 후 직접 자동 으로 실 행 됩 니 다. 보통 자체 호출 익명 함수 (Self - invoked Anonymous Function) 또는 직접 호출 함수 표현 식 (Immediately Invoked Function Expression) 이 라 고 합 니 다.형식 은 다음 과 같 습 니 다.
(function(){
   //             
})();  
(function(a,b){
   var result = a+b;
   return result;
})(10,20)

8. 배열 에서 무 작위 로 구성원 가 져 오기
var items = [12, 548 , 'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' , 2145 , 119];
var  randomItem = items[Math.floor(Math.random() * items.length)];

9. 지 정 된 범위 안의 임 의 수 를 얻 는 이 기능 은 테스트 용 가짜 데 이 터 를 생 성 할 때 특히 수량 이 있다. 예 를 들 어 소개 와 지 정 된 범위 안의 월급 수 등 이다.
var x = Math.floor(Math.random() * (max - min + 1)) + min;

10. 0 에서 지정 한 값 까지 의 숫자 배열 생 성
var numbersArray = [] , max = 100;
for( var i=1; numbersArray.push(i++) < max;);  // numbers = [1,2,3 ... 100]

11. 무 작위 알파벳 숫자 문자열 생 성
function generateRandomAlphaNum(len) {
   var rdmString = "";
   for( ; rdmString.length < len; rdmString  += Math.random().toString(36).substr(2));
   return  rdmString.substr(0, len);
}

12. 숫자 배열 의 순 서 를 흐 트 러 뜨 린 다.
var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
numbers = numbers.sort(function(){ return Math.random() - 0.5});

/ * numbers 배열 은 [120, 5, 228, - 215, 400, 458, - 85411, 122205] * /
자 바스 크 립 트 에 내 장 된 배열 정렬 함 수 를 사 용 했 습 니 다. 더 좋 은 방법 은 전문 적 인 코드 로 (예 를 들 어 Fisher - Yates 알고리즘) 을 실현 하 는 것 입 니 다. StackOverFlow 의 이 토론 을 참조 할 수 있 습 니 다.13. 문자열 의 빈 칸 제거 자바, C \ #, PHP 등 언어 는 모두 전문 적 인 문자열 의 빈 칸 제거 함 수 를 실현 하지만 자바 스 크 립 트 에는 없습니다. 아래 코드 를 통 해 String 대상 함수 에 trim 함 수 를 제공 할 수 있 습 니 다.
1
String.prototype.trim = function(){return this.replace(/^\s+|\s+$/g, "");};
새로운 자 바스 크 립 트 엔진 은 이미 trim () 의 원생 실현 이 있 었 다.14. 배열 간 추가

var array1 = [12 , "foo" , {name "Joe"} , -2458];
var array2 = ["Doe" , 555 , 100];
Array.prototype.push.apply(array1, array2);
/* array1     [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */

15. 대상 이 배열 로 전환
var argArray = Array.prototype.slice.call(arguments);

16. 숫자 인지 검증

function isNumber(n){
   return !isNaN(parseFloat(n)) && isFinite(n);
}

17. 배열 인지 검증

function isArray(obj){
   return Object.prototype.toString.call(obj) === '[object Array]' ;
}

그러나 toString () 방법 이 재 작성 되면 통 하지 않 는 다.다음 방법 도 사용 할 수 있다.
Array.isArray(obj); // its a new Array method

브 라 우 저 에 frame 을 사용 하지 않 으 면 인 스 턴 스 of 도 사용 할 수 있 지만 문맥 이 너무 복잡 하면 오류 가 발생 할 수 있 습 니 다.

var myFrame = document.createElement('iframe');
document.body.appendChild(myFrame);
var myArray = window.frames[window.frames.length-1].Array;
var arr = new myArray(a,b,10); // [a,b,10]  
// myArray         ,instanceof        
//         frame    
arr instanceof Array; // false

18. 배열 의 최대 값 과 최소 값 가 져 오기

var  numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411];
var maxInNumbers = Math.max.apply(Math, numbers);
var minInNumbers = Math.min.apply(Math, numbers);

19. 배열 비우 기

var myArray = [12 , 222 , 1000 ];  
myArray.length = 0; // myArray will be equal to [].

20. 배열 에서 delete 나 remove 요 소 를 직접 사용 하지 마 십시오. 배열 요소 에 delete 를 직접 사용 하면 삭제 되 지 않 고 원 소 를 undefined 로 설정 합 니 다.배열 요소 삭 제 는 splice 를 사용 해 야 합 니 다.절대:

var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
items.length; // return 11 
delete items[3]; // return true 
items.length; // return 11 
/* items     [12, 548, "a", undefined × 1, 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119] */

대답:
var items = [12, 548 ,'a' , 2 , 5478 , 'foo' , 8852, , 'Doe' ,2154 , 119 ];
items.length; // return 11 
items.splice(3,1) ;
items.length; // return 10 
/* items     [12, 548, "a", 5478, "foo", 8852, undefined × 1, "Doe", 2154, 119]

대상 의 속성 을 삭제 할 때 delete 를 사용 할 수 있 습 니 다.21. length 속성 을 사용 하여 배열 앞의 예 에서 length 속성 으로 배열 을 비 웁 니 다. 또한 배열 을 차단 할 수 있 습 니 다.
var myArray = [12 , 222 , 1000 , 124 , 98 , 10 ];  
myArray.length = 4; // myArray will be equal to [12 , 222 , 1000 , 124].

이와 함께 length 속성 을 커지 면 배열 의 길이 가 증가 하고 undefined 를 사용 하여 새로운 요소 로 채 웁 니 다.length 는 쓸 수 있 는 속성 입 니 다.
myArray.length = 10; // the new array length is 10 
myArray[myArray.length - 1] ; // undefined

22. 조건 에서 논리 와 또는
var foo = 10;  
foo == 10 && doSomething(); // is the same thing as if (foo == 10) doSomething(); 
foo == 5 || doSomething(); // is the same thing as if (foo != 5) doSomething();

함수 매개 변수의 기본 값 과 같은 기본 값 을 논리 적 으로 설정 할 수도 있 습 니 다.

function doSomething(arg1){
   arg1 = arg1 || 10; // arg1 will have 10 as a default value if it’s not already set
}

23. map () 함수 방법 으로 데이터 순환
var squares = [1,2,3,4].map(function (val) {  
   return val * val;  
});
// squares will be equal to [1, 4, 9, 16]

24. 지정 한 소수 자리 유지
var num =2.443242342;
num = num.toFixed(4);  // num will be equal to 2.4432

toFixec () 는 숫자 가 아 닌 문자열 을 되 돌려 줍 니 다.25. 부동 소수점 계산 문제

0.1 + 0.2 === 0.3 // is false 
9007199254740992 + 1 // is equal to 9007199254740992
9007199254740992 + 2 // is equal to 9007199254740994

왜 일 까요?0.1 + 0.2 는 0. 300000000000004 이기 때문이다.자 바스 크 립 트 의 숫자 는 IEEE 754 표준 에 따라 구 축 됩 니 다. 내부 에 64 비트 부동 소수점 소수 로 표시 되 어 있 으 며, 자 바스 크 립 트 의 숫자 가 어떻게 인 코딩 되 었 는 지 구체 적 으로 참조 할 수 있 습 니 다. toFixed () 와 toPrecision () 을 사용 하여 이 문 제 를 해결 할 수 있 습 니 다.26. for - in 순환 검사 대상 의 속성 아래 와 같은 용법 을 통 해 교체 할 때 대상 의 원형 속성 에 들 어 가 는 것 을 방지 할 수 있 습 니 다.

for (var name in object) {  
   if (object.hasOwnProperty(name)) {
       // do something with name
   }  
}

27. 쉼표 연산 자

var a = 0;
var b = ( a++, 99 );
console.log(a);  // a will be equal to 1 
console.log(b);  // b is equal to 99

28. 계산 과 조회 에 사용 할 변 수 를 jQuery 선택 기 에 임시 저장 하고 전체 DOM 요 소 를 임시 저장 할 수 있 습 니 다.

var navright = document.querySelector('#right');
var navleft = document.querySelector('#left');
var navup = document.querySelector('#up');
var navdown = document.querySelector('#down');

29. isFinite () 에 들 어 오 는 인 자 를 미리 검사 합 니 다.

isFinite(0/0) ; // false
isFinite("foo"); // false
isFinite("10"); // true
isFinite(10);   // true
isFinite(undefined);  // false
isFinite();   // false
isFinite(null);  // true,       

30. 배열 에서 마이너스 로 색인 하 는 것 을 피한다.

var numbersArray = [1,2,3,4,5];
var from = numbersArray.indexOf("foo") ;  // from is equal to -1
numbersArray.splice(from,2);    // will return [5]

splice 에 전 달 된 색인 매개 변 수 는 음수 가 아니 라 음수 일 때 배열 의 끝 에서 요 소 를 삭제 합 니 다.31. JSON 으로 서열 화 와 반 서열 화

var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} };
var stringFromPerson = JSON.stringify(person);
/* stringFromPerson     "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}"   */
var personFromString = JSON.parse(stringFromPerson);
/* personFromString     person       */

32. eval () 또는 함수 구조 기 eval () 과 함수 구조 기 (Function consturctor) 를 사용 하지 마 십시오. 호출 할 때마다 자 바스 크 립 트 엔진 은 소스 코드 를 실행 가능 한 코드 로 변환 합 니 다.

var func1 = new Function(functionCode);
var func2 = eval(functionCode);

33 、 사용 을 피한다 with ()
with () 를 사용 하면 전역 역할 영역 에 변 수 를 추가 할 수 있 습 니 다. 따라서 다른 동명 변수 가 있 으 면 헷 갈 리 기 쉬 우 며, 2 차 값 도 덮어 씁 니 다.34. 배열 에 for - in 을 사용 하지 마 십시오.

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 순환 의 첫 번 째 성명 에서 두 사람 은 한 번 만 초기 화 할 수 있 습 니 다. 이것 은 다음 과 같은 쓰기 보다 빠 릅 니 다.

for (var i = 0; i < arrayNumbers.length; i++)

35. setInterval () 과 setTimeout () 에 전달 할 때 문자열 이 아 닌 함 수 를 사용 합 니 다. setTimeout () 과 setInterval () 에 전달 하면 eval 과 유사 한 방식 으로 변환 합 니 다. 느 릴 수 있 으 므 로 사용 하지 마 십시오.
setInterval('doSomethingPeriodically()', 1000);  
setTimeout('doSomethingAfterFiveSeconds()', 5000);

대신:
setInterval(doSomethingPeriodically, 1000);  
setTimeout(doSomethingAfterFiveSeconds, 5000);

36. 한 겹 의 if / else 대신 switch / case 를 사용 합 니 다.
두 갈래 가 넘 는 것 으로 판단 할 때 switch / case 를 사용 하 는 것 이 더 빠 르 고 우아 하 며 코드 조직 에 유리 합 니 다. 물론 10 갈래 가 넘 으 면 switch / case 를 사용 하지 마 세 요.37. switch / case 에서 디지털 구간 을 사용 합 니 다. 사실 switch / case 의 case 조건 은 이렇게 쓸 수 있 습 니 다.

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"

38. 대상 을 대상 으로 하 는 원형 아래 에서 이렇게 하면 대상 을 매개 변수 로 하여 이 를 원형 으로 하 는 새로운 대상 을 만 들 수 있다.

function clone(object) {  
   function OneShotConstructor(){};
   OneShotConstructor.prototype = object;  
   return new OneShotConstructor();
}
clone(Array).prototype ;  // []

39. HTML 필드 변환 함수

function escapeHTML(text) {  
   var replacements= {"": ">","&": "&", "\"": """};                      
   return text.replace(/[<>&"]/g, function(character) {  
       return replacements[character];  
   });
}

40. try - catch - finally try - catch - finally 에서 catch 부분 을 순환 내부 에서 사용 하지 마 십시오. 이 변 수 는 실행 할 때 역할 영역 내의 새로운 변수 로 구 축 됩 니 다.절대:

var object = ['foo', 'bar'], i;  
for (i = 0, len = object.length; i 

마땅 히

var object = ['foo', 'bar'], i;  
try {
   for (i = 0, len = object.length; i 

41. XML HttpRequests 를 사용 할 때 시간 초과 XML HttpRequests 가 실 행 될 때 장시간 응답 하지 않 을 때 (예 를 들 어 네트워크 문제 등) 연결 을 중지 해 야 합 니 다. setTimeout () 을 통 해 이 작업 을 완성 할 수 있 습 니 다.

var xhr = new XMLHttpRequest ();
xhr.onreadystatechange = function () {  
   if (this.readyState == 4) {  
       clearTimeout(timeout);  
       // do something with response data 
   }  
}  
var timeout = setTimeout( function () {  
   xhr.abort(); // call error callback  
}, 60*1000 /* timeout after a minute */ );
xhr.open('GET', url, true);  
xhr.send();

동시에 주의해 야 할 것 은 여러 개의 XML HttpRequests 요청 을 동시에 하지 말 라 는 것 이다.42. WebSocket 을 처리 하 는 시간 초과 일반적인 상황 에서 WebSocket 연결 을 만 든 후 30 초 안에 아무런 활동 이 없 으 면 서버 측 에서 연결 을 시간 초과 처리 하고 방화벽 도 단위 주기 에 활동 이 없 는 연결 을 시간 초과 처리 할 수 있다.이러한 상황 을 방지 하기 위해 서 는 일정 시간 마다 서버 에 빈 메 시 지 를 보 낼 수 있다.다음 두 함 수 를 통 해 이 수 요 를 실현 할 수 있 습 니 다. 하 나 는 연결 이 활동 상 태 를 유지 하 는 데 사용 되 고 다른 하 나 는 이 상 태 를 끝 내 는 데 사 용 됩 니 다.

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 () 방법의 맨 끝 에 놓 을 수 있 습 니 다.43. 시간 은 원래 의 조작 부호 가 함수 보다 빨리 호출 되 는 것 을 주의해 야 한다. 예 를 들 어 Vanilla JS 를 사용 하면 보통 이렇게 하지 않 는 다.

var min = Math.min(a,b);
A.push(v);

이렇게 대체 할 수 있다.

var min = a < b ? a : b;
A[A.length] = v;

44. 개발 시 코드 구 조 를 주의 하고 온라인 에서 자바 스 크 립 트 코드 를 검사 하고 압축 하면 JSlint 또는 JSmin 등 도 구 를 사용 하여 코드 를 검사 하고 압축 할 수 있 습 니 다.45. JavaScript 는 넓 고 심오 합 니 다. 여기 좋 은 학습 자원 Code Academy 자원 이 있 습 니 다.http://www.codecademy.com/tracks/javascript
Marjin Haverbekex 가 작성 한 Eloquent JavaScript:http://eloquentjavascript.net/
John Resig 가 작성 한 Advanced JavaScript:http://ejohn.org/apps/learn/

좋은 웹페이지 즐겨찾기