이 첫 번째 기사는 NodeJS의 일부 프로그래밍 세부 사항에 대해 이야기합니다.
1. 배열을 통해 반복
for (var i = 0, l = arr.length; i <l; i ++)
이 방법을 작성하는 한 가지 장점은 각 루프에서 배열 객체의 길이를 한 단계 줄어든 작업을 수행하는 것입니다. 배열 길이가 길수록 값이 더 명백합니다.
2. 변수의 진위를 결정하십시오
if (a) {...} // a = '', a = '0', a = [], a = {}조건부 판단의 결과는 : 거짓, 참, 참, 참입니다. 이 결과는 PHP의 결과와 다르므로 혼란스럽지 마십시오. 또한 비 정체성 판단과 유사한 상황을 구별해야합니다.
3. 0 값의 비 식별 판단
1 if (0 == '0') {...} // true2 if (0 == []) {... ...} // true3 if (0 == [0]) {...} // true4 if (0 == {}) {...} // false5 if (0 == null) {... ...} // false6 if (0 ==} // salse).사실, 그러한 이상한 판단이 많이 있으며, 나는 더 일반적인 판단 만 나열했습니다. 규칙을 이해하려면 JavaScript의 관계형 작업에 대한 [JavaScript] 심층 분석 및 IF 문의 다른 블로그 게시물을 참조하십시오.
4. Parseint의 함정
var n = parseint (s); // s = '010'
성명서가 실행 된 후, N 값은 8, 10이 아닌 8입니다. 많은 사람들이 이것을 알고 있지만, 프로그래밍에 실수가있을 것이라는 것은 불가피하며, 나는 그것을 깊이 이해하고 있습니다. 따라서 다음 방식으로 작성하는 것이 가장 좋으므로 오류가 없습니다.
var n = parseint (s, 10);
5. 사용하기 전에 변수를 선언해야합니다
변수를 선언하지 않고 직접 실수를하지는 않지만 이런 식으로 글을 쓸 때 실수를 쉽게하는 것이 쉽습니다. 인터프리터는이를 글로벌 변수로 해석하기 때문에 다른 글로벌 변수로 나누어 오류를 유발할 수 있습니다. 따라서 변수를 사용하기 전에 변수를 선언하는 좋은 습관을 개발해야합니다.
6. 루프에 비동기가 있습니다
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "nx_user에서 선택 *"; db.query (sql, function () {sys.log (i + ':' + sql);}); //db.Query는 테이블 쿼리 작업으로 비동기 조작입니다}출력 결과는 동일하며 i = arr.length-1 일 때 출력 내용입니다. JavaScript는 단일 스레드이므로 비동기 작업을 수행하기 전에 전체 루프의 동기 컨텐츠를 실행합니다. 코드의 익명 콜백 함수는 비동기 콜백입니다. 함수가 실행되면 FOR 루프 및 일부 후속 동기화 작업이 실행되었습니다. 폐쇄 원칙으로 인해이 함수는 SQL 변수의 내용과 For 루프의 마지막 루프의 I 변수를 유지하므로 결과가 잘못됩니다.
그래서 어떻게해야합니까? 두 가지 솔루션이 있습니다. 하나는 다음과 같이 즉각적인 기능을 사용하는 것입니다.
for (var i = 0, l = arr.length; i <l; i ++) {var sql = "nx_user에서 선택 *"; (function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db. Query다른 방법은 비동기 조작 부분을 추출하고 다음과 같이 단일 함수를 작성하는 것입니다.
var outputsql = function (sql, i) {db.query (sql, function () {sys.log (i + ':' + sql);}); //db.query는 테이블 쿼리 작업으로 (var i = 0, l = arr.length; i <l; i ++) {var sql = "nx_user에서 선택 *"; OutputSQL (SQL, I); }7. 다량의 데이터를 처리 할 때 루프 중첩을 피하십시오.
루프 중첩 처리 시간은 데이터 양의 증가에 따라 기하 급수적으로 증가하기 때문에 가능한 한 많이 피해야합니다. 이 경우 더 나은 방법이 없다면 일반 전략은 시간 동안 공간을 교환하는 것입니다. 즉, 2 차 순환 데이터의 해시 매핑 테이블을 설정하는 것입니다. 물론 특정 상황 분석도 필요합니다. 또 다른 방법은 일부 방법은 Array.sort ()와 같은 루프 본체 자체라는 것입니다 (이 방법은 두 개의 루프 레이어로 구현되어야 함)이므로 사용할 때주의를 기울여야합니다.
8. 재귀 통화를 피하십시오.
재귀 호출의 장점은 코드가 간결하고 구현이 간단하지만 단점은 매우 중요하다는 것입니다. 다음 설명은 다음과 같습니다.
(1) 함수 스택의 크기는 재귀 레벨과 함께 선형으로 증가하고 함수 스택은 상한 값을 갖는다. 재귀가 특정 수의 레이어에 도달하면 함수 스택이 오버플로 연결되어 프로그램 오류가 발생합니다.
(2) 각 재귀 층은 추가 스택 프레스 및 스택 릴리스 작업, 즉 기능 호출 중 저장 사이트 및 복구 사이트를 추가합니다.
따라서 재귀 호출은 가능한 한 많이 피해야합니다.
9. 모듈 파일의 범위 격리와 관련하여.
Node가 JavaScript 모듈 파일을 컴파일하면 다음과 같이 컨텐츠가 시작 및 끝에 래핑되었습니다.
(함수 (내보내기, 요구, 모듈, __filename, __dirname) {javaScript 파일 코드});이를 통해 각 모듈 파일간에 범위를 격리 할 수 있습니다. 따라서 Nodejs 모듈 파일을 작성하면 다른 스코프 격리 캡슐화 계층을 추가 할 필요가 없습니다. 예를 들어, 다음 코드 형식은 추가 기능 호출 계층 만 추가합니다. 권장하지 않습니다.
(기능(){ ... …})();10. 배열과 객체를 혼합하지 마십시오
오류 코드의 예는 다음과 같습니다.
var o = []; o [ 'name'] = 'liming';
혼합 어레이와 객체는 예측할 수없는 오류로 이어질 수 있습니다. 내 동료가 매우 이상한 문제를 겪었습니다. 먼저 코드를 살펴 보겠습니다.
var o = []; o [ 'name'] = 'liming'; var s = json.stringify (o);
그는 Object O의 이름 속성이 JSON 문자열에있을 것이라고 생각했지만 결과는 아무것도 아니었다. 나는 또한 당시에는 매우 이상했지만 배열과 물체를 믹싱하는 데 문제가 있다는 예상을 가졌습니다. 나는 그것을 시도했고 그것은 실제로 그 문제였습니다. 나중에 ECMA 사양에서 배열이 JA 규칙에 따라 직렬화된다는 것을 발견했습니다. 따라서 좋은 프로그래밍 습관을 개발하고 배열과 객체를 올바르게 사용하고 혼합하지 않아야합니다.
11. 우아한 프로그래밍을 약속하십시오
Nodejs에 노출 된 사람들 이이 경험을 가지고 있다고 생각합니다. 비동기 콜백이 비동기 콜백에 중첩되면 코드가 매우 혼란스러워 보이고 가독성이 부족합니다. Nodejs의 이러한 딜레마는 약속으로 극복 될 수 있습니다. 약속은 코드를 우아하고 아름답게 만드는 조각 도구와 같습니다. 약속에 대한 A+ 사양이 있으며 온라인으로 몇 가지 구현 방법이 있습니다. 참조 할 수 있습니다.