《 자 바스 크 립 트 모드 》 독서 노트 (2) - 기본 기교 2
、
for
for 순환 은 인용 수 (arguments) 와 HTML 용기 (HTML Collation) 와 같은 배열 이나 클래스 의 대상 을 옮 겨 다 니 는 데 자주 사 용 됩 니 다.보통 for 순환 모드 는 다음 과 같이 사용 합 니 다.
for(var i = 0; i < myarray.length; i++) {
// myarray[i]
}
이 모델 의 문 제 는 순환 이 바 뀔 때마다 데이터 의 길 이 를 방문 해 야 한 다 는 점 이다.이러 면 안 돼.그래서:
for(var i = 0, max = myarray.length; i < max; i++) {
// myarray[i]
}
우 리 는 이렇게 해서 먼저 길 이 를 저장 할 수 있다. 그러면 매번 순환 할 때마다 데이터 의 길 이 를 방문 하지 않 을 것 이다.특히 일부 DOM 작업 하에 서 접근 속도 가 매우 느리다.
다음은 단일 변수 모드 이 며, 변 수 를 순환 이외 의 곳 에 놓 을 수도 있 습 니 다.
function looper() {
var i = 0,
max,
myarray = [];
// ...
for (i = 0,max = myarray.length; i < max; i++){
// myarray[i]
}
}
이런 모델 의 장점 은 단일 변수의 모델 을 관통 하기 때문에 일치 성에 있다.결함 은 코드 를 만 들 때 전체 순환 을 붙 이 고 복사 하 는 것 이 귀 찮 습 니 다.예 를 들 어 한 함수 에서 다른 함수 로 순환 하려 면 i 와 max 를 새 함수 에 가 져 갈 수 있 도록 확보 해 야 합 니 다 (이 몇 개의 양 이 원 함수 에서 더 이상 필요 하지 않 으 면 삭제 할 수 있 습 니 다).여기 서 복 제 는 단순히 다른 곳 으로 가 는 것 이 아니 라 js 코드 재 활용 모드 를 통 해 다른 함수 에서 사용 합 니 다.
순환 의 마지막 개선 에 대해 서 는 두 가지 표현 식 대신 i + + 를 사용 합 니 다.
for 모드 가 무 거 운 두 변 수 는 작은 조작 을 이 끌 어 냈 습 니 다. 그 이 유 는:
첫 번 째 수 정 된 모드:
var i ,myarray = [];
for(i = myarray.length; i--;){
// myarray[i]
}
두 번 째 사용 while 순환:
var myarray = [],i = myarray.length;
while(i--){
// myarray[i]
}
2. for - in 순환
for - in 순환 은 비 배열 대상 을 옮 겨 다 니 는 데 사용 해 야 합 니 다.for - in 순환 을 사용 하 는 것 도 매 거 진 (enumeration) 이 됩 니 다.기술적 으로 for - in 순환 을 사용 하여 배열 을 옮 겨 다 닐 수 있 습 니 다 (자바 스 크 립 트 에서 배열 도 대상 이기 때 문 입 니 다). 그러나 이 배열 의 대상 이 사용자 정의 함수 로 확대 되 었 을 때 논리 적 인 오 류 를 초래 할 수 있 기 때 문 입 니 다.
var myarray = ['a','b','c','d'];
for(var i in myarray) {
console.log(i)
console.log(myarray[i])
}
대상 속성 을 옮 겨 다 니 며 프로 토 타 입 체인 의 속성 을 걸 러 낼 때 hasOwnProperty () 방법 을 사용 할 때 매우 중요 합 니 다.예 를 들 면:
var man = {
hands:2,
legs:2,
heads:1
}
//
//
if(typeof Object.prototype.clone === 'undefined'){
Object.prototype.clone = function () {};
}
//
for(var i in man) {
console.log(i + ':' + man[i])
}
아니면, 그래 야 네가 원 하 는 것 이다.
var man = {
hands:2,
legs:2,
heads:1
}
//
//
if(typeof Object.prototype.clone === 'undefined'){
Object.prototype.clone = function () {};
}
for(var i in man) {
if(man.hasOwnProperty(i)) {
console.log(i + ':' + man[i])
}
}
그럼 한 마디 더 하 자 면 Object. hasOwnProperty () 방법 은 무엇 을 하 는 것 입 니까?방법 은 불 값 을 되 돌려 주 고 대상 자체 속성 에 지정 한 속성 이 있 는 지 여부 (즉, 지정 한 키 가 있 는 지 여부) 를 표시 합 니 다.이것 은 MDN 상의 표현 이다.즉, 이 방법 은 이 속성 이 다른 소스 (예 를 들 어 원형 체인 의 속성) 가 아 닌 대상 자체 의 속성 인지 알려 줄 것 이다.
다른 hasOwnProperty () 를 사용 하 는 모드 는 Object. property 에서 이 함 수 를 호출 하 는 것 입 니 다. 예 를 들 어:
for(var i in man) {
if(Object.prototype.hasOwnProperty.call(man,i)) {
console.log(i + ':' + man[i])
}
}
hasOwnProperty 를 사용 하여 man 대상 을 정련 한 후에 이름 충돌 을 효과적으로 피 할 수 있 고 로 컬 변 수 를 사용 하여 비교적 긴 속성 명 을 캐 시 할 수 있 습 니 다. 예 를 들 어:
var i,
hasOwn = Object.prototype.hasOwnProperty;
for(i in man) {
if(hasOwn.call(man,i)) {
console.log(i + ':' + man[i])
}
}
주의: 엄 밀 히 말 하면 hasOwnProperty () 를 사용 하지 않 는 것 은 잘못 이 없습니다.구체 적 인 작업 과 코드 에 대한 자신 감 에 의존 하면 이 방법 을 생략 하고 순환 의 실행 속 도 를 약간 가속 화 할 수 있 습 니 다.그러나 대상 의 내용 (원형 체인 과) 을 확인 하지 못 할 경우 hasOwnProperty () 와 같은 안전 검 사 를 추가 하 는 것 이 좋다.
포맷 된 변종 이 있 지만 개인 적 으로 는 이렇게 사용 하 는 것 을 추천 하지 않 습 니 다. 가 독성 이 매우 떨 어 지기 때문에 JSlint 검 사 를 통과 할 수 없습니다.
var i,
hasOwn = Object.prototype.hasOwnProperty;
for(i in man) if(hasOwn.call(man,i)) {
console.log(i + ':' + man[i])
}
유일한 장점 은 괄호 하 나 를 아 끼 는 것 입 니까?
3. 내 장 된 원형 을 추가 하지 마 세 요.
구조 함수 의 원형 속성 을 증가 시 키 는 것 은 기능 성 을 강화 하 는 강력 한 방법 이지 만 가끔 은 이 방법 이 너무 강하 다.내장 구조 함수 (예 를 들 어 Object (), Array (), Function () 등) 의 원형 을 추가 하 는 것 은 유혹 적 이지 만 유지 가능성 에 심각 한 영향 을 미 칠 수 있 습 니 다. 이러한 방법 은 코드 를 더욱 예측 할 수 없 게 만 들 기 때 문 입 니 다.
따라서 가장 좋 은 방법 은 내 장 된 원형 에 속성 을 추가 하지 않 는 것 이다. 1. 미래의 ECMAScript 버 전이 나 JavaScript 의 구체 적 인 실현 이 이 기능 을 통 일 된 내 장 된 방법 으로 할 수 있 을 때 를 제외 하고.2. 사용자 정의 속성 이나 방법 이 존재 하지 않 을 때 검사 합 니 다.또는 서로 다른 브 라 우 저 나 같은 브 라 우 저의 서로 다른 버 전 을 통일 하기 위해 호 환 되 는 경우 존재 여 부 를 확인 하 는 것 이 전제 입 니 다.3. 문서 기록, 그리고 팀 과 명확 하 게 소통 합 니 다.
만약 위의 장면 을 만 났 다 면, 당신 은 이렇게 할 수 있 습 니 다.
if(typeof Object.prototype.myMethod !== 'function'){
Object.prototype.myMethod = function () {
// implementation
}
}
4. switch 모드
switch 하면 한 마디 더 하 겠 습 니 다. 많은 초보 자 들 이 if - else 의 성능 이 더 좋 은 지, 아니면 switch 의 성능 이 더 좋 은 지 고민 합 니 다.우선 구체 적 인 장면 을 버 리 고 성능 을 말 하 는 것 은 깡패 짓 이다.그 다음으로 switch 는 c + + 와 같은 언어 에서 성능 이 좀 좋아 야 합 니 다.그러나 자바 스 크 립 트 에 서 는 둘 다 거의 다 르 지 않 으 며 switch 는 의외 의 문 제 를 일 으 킬 수 있 으 므 로 if - else 를 사용 하 는 것 을 권장 합 니 다.
switch 가 더 좋 은 선택 이 라 고 확신한다 면 이렇게 할 수 있 습 니 다.
var inspect_me = 0,
result = '';
switch (inspect) {
case 0:
result = 'zero';
break;
case 1:
result = 'one';
break;
default:
result = 'unknow';
break;
}
보통 형식 은 다음 과 같 습 니 다.
5. 암시 적 유형 전환 사용 을 피한다.
프로그램 에서 = = 또는! = 을 사용 하지 마 세 요.사용 하 세 요.자 바스 크 립 트 는 비교 문 구 를 사용 할 때 암시 적 형식 변환 을 실행 하기 때문이다.전환 하 는 장면 이 네가 아 는 것 보다 훨씬 많 을 것 이다.
6. eval () 사용 을 피한다.
eval () 은 마귀 입 니 다. 당신 의 꿈 을 이 룰 수도 있 고 영혼 을 빼 앗 을 수도 있 습 니 다.따라서 코드 에 eval () 을 사용 하 는 것 을 피하 십시오.
이 함 수 는 임의의 문자열 을 자 바스 크 립 트 코드 로 실행 할 수 있 습 니 다.토론 할 코드 가 미리 컴 파일 되 어 있 을 때 (동적 으로 실 행 될 때 결정 되 는 것 이 아니 라) eval () 을 사용 할 이유 가 없습니다.코드 가 실 행 될 때 동적 으로 생 성 된다 면 eval () 대신 더 좋 은 방법 도 있 습 니 다.예 를 들 면:
//
var property = 'name';
alert(eval("obj." + property));
//
alert(obj[property])
eval () 을 사용 하 는 것 도 일부 안전 위험 을 포함 합 니 다. 이렇게 하면 변 경 된 코드 (예 를 들 어 네트워크 에서 온 코드) 를 실행 할 수 있 기 때 문 입 니 다.
한 가지 더 명심 해 야 할 것 은setInterval (), setTimeout (), function () 등 구조 함 수 를 통 해 파 라 메 터 를 전달 하고 대부분의 경우 eval () 과 유사 한 위험 을 초래 할 수 있 으 므 로 이 함수 들 을 사용 하지 않도록 해 야 합 니 다.막후 에서 자 바스 크 립 트 는 프로그램 코드 로 전 달 된 문자열 을 평가 하고 실행 해 야 합 니 다.
//
setTimeout('myFunc()',1000);
setTimeout('myFunc(1,2,3)',1000);
//
setTimeout(myFunc,1000);
setTimeout(function() {
myFunc()
},1000)
new Function () 구조 함 수 를 사용 하 는 것 은 eval () 을 사용 하 는 것 과 유사 하기 때문에 이 함수 의 사용 도 매우 조심해 야 합 니 다. 이 함 수 는 기능 이 강 한 함수 이지 만 오용 되 기 쉽 습 니 다.eval () 을 꼭 사용 해 야 한다 면 new Function () 으로 대체 하 는 것 도 고려 할 수 있다.이렇게 하 는 잠재 적 인 장점 은 new Function () 의 코드 가 부분 함수 공간 에서 실 행 될 것 이기 때문에 코드 에서 var 정 의 를 사용 하 는 변 수 는 자동 으로 전체 변수 가 되 지 않 습 니 다.자동 으로 전역 변수 가 되 는 것 을 피 하 는 또 다른 방법 은 eval () 호출 을 실시 간 함수 에 패키지 하 는 것 입 니 다.
아래 코드 를 보 세 요. 여기 서 un 이라는 변수 만 전체 변수 이 고 네 임 스페이스 에 영향 을 줄 수 있 습 니 다.
console.log(typeof un);
console.log(typeof deux);
console.log(typeof trois);
var jsstring = "var un = 1; console.log(un)";
eval(jsstring);
jsstring = "var deux = 2; console.log(deux)";
new Function(jsstring)();
jsstring = "var trois = 3; console.log(trois)";
(function() {
eval(jsstring);
}());
console.log(typeof un);
console.log(typeof deux);
console.log(typeof trois);
또 다른 new Function () 과 eval () 의 차 이 는 eval () 이 역할 영역 체인 에 영향 을 줄 수 있 고 Function 은 하나의 샌 드 박스 와 유사 하 다.어디서 Function 을 실행 하 든 전체 역할 영역 만 볼 수 있 습 니 다.따라서 국부 변수 에 대한 영향 은 비교적 작다.다음 의 예, eval () 은 외부 역할 영역의 변 수 를 방문 하고 수정 할 수 있 지만, Function 은 안 됩 니 다. (Function 을 사용 하 는 것 과 new Function 을 사용 하 는 것 은 같 음 을 주의 하 십시오.)
(function () {
var local = 1;
eval("local = 3;console.log(local)");
console.log(local);
}());
(function() {
var local = 1;
Function("console.log(typeof local);")();
}())
7. parseInt () 의 수치 약속 사용
paresInt () 를 사용 하면 문자열 에서 수 치 를 가 져 올 수 있 습 니 다.이 함수 의 두 번 째 매개 변 수 는 금지 매개 변수 입 니 다. 보통 이 매개 변 수 를 무시 할 수 있 지만 이렇게 하지 않 는 것 이 좋 습 니 다.해 석 된 문자열 이 0 으로 시작 하면 오류 가 발생 하기 때 문 입 니 다. 예 를 들 어 처리 날짜 가 일부 날짜 만 필드 에 들 어 갑 니 다.ECMAScript 3 에서 0 으로 시작 하 는 문자열 은 8 진수 로 간주 되 며, ECMAScript 5 에서 변 경 됩 니 다.일치 하지 않 고 예상 되 는 결 과 를 피하 기 위해 서 매번 구체 적 인 진법 인 자 를 지정 하 십시오.
var month = '06',
year = '09';
month = parseInt(month,10);
year = parseInt(year,10);
console.log(month,year);
또 다른 문자열 을 수치 로 변환 하 는 방법 은:
Number('01');
이 방법 은 보통 parseInt () 보다 훨씬 빠 릅 니 다. 이름 처럼 parseInt () 은 간단 한 전환 이 아니 라 해석 이기 때 문 입 니 다.그러나 '08 hello' 가 하나의 수 치 를 되 돌려 주 기 를 원한 다 면 parseInt () 을 제외 한 다른 방법 은 모두 실패 하고 NaN 으로 돌아 갑 니 다.
이 내용 은 비교적 많 지만 실제 업무 에서 매우 가치 가 있다.다음 편 에 서 는 명명, 괄호 치기, 빈 칸 들 어가 기 등 인 코딩 에서 의 규범 과 제약 을 논의 할 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.