javascript에서 for와 for in의 차이점과 for in이 권장되지 않는 이유
jsvar array=['a']
//标准的
for循环
for(var i=1;i<array.length;i++){
alert(array[i])
}
//
foreach
循环
for(var i in array){
alert(array[i])
}
을 순회하는 방법에는 두 가지가 있습니다. 일반적으로 위의 두 가지 배열 순회 방법의 결과는 동일합니다. 둘 사이의 첫 번째 차이점에 대해 이야기해 보겠습니다
표준 for 루프의 i는 배열의 첨자를 나타내는 숫자 유형이지만 foreach 루프의 i는 배열의 키가 문자열 유형임을 나타냅니다. 왜냐하면 js의 모든 것은 모두 객체이기 때문입니다. 직접 시도해 보세요. Alert(typeof i); 이 차이는 사소한 문제입니다. 이제 다음 코드를 추가하면 위의 실행 결과가 달라집니다.
//扩展了js原生的Array Array.prototype.test=function() }
시험해보고 위 코드의 기능을 확인하세요. 우리는 표준 for 루프가 여전히 배열 전체를 반복한다는 사실을 발견했습니다. 하지만 이때 foreach 루프는 제가 방금 작성한 테스트 메서드를 인쇄합니다. 이것이 배열을 순회하는 for와 foreach의 가장 큰 차이점입니다. foreach를 사용하여 프로젝트에서 배열을 순회하는 경우 어느 날 누군가 실수로 js의 기본 Array 클래스를 확장하거나 외부 js 프레임워크를 도입하고 확장한다고 가정해 보겠습니다. 네이티브 배열. 그런 다음 문제가 발생합니다.
for in 문을 사용하면 어떨까요?
키워드: 기본 Array 클래스, 확장 Array 클래스
for in 문을 사용하여 배열 객체를 탐색할 때 발생할 수 있는 버그는 다음과 같습니다. 기본 Array 클래스가 다른 js 스크립트 라이브러리에 의해 프로토타입 확장된 경우(예: JSON에 추가 추가) 메서드, 즉 Array .prototype.toJSON=xxxx), 확장된 Array 객체를 순회하기 위해 for in을 사용하는 논리는 기본 Array 객체를 순회하는 논리와 다릅니다.
간단한 예를 들면
var x=[1]; for(var s in x){ alert(s); };
상식에 따르면 Array가 기본 js 클래스인 경우 위 명령문은 경고 메서드를 한 번만 실행해야 하며 s는 배열의 index 0입니다. 그러나 Array 클래스가 추가 toJSON 메서드로 확장되면 위 문은 경고를 두 번 실행합니다. 첫 번째 s는 인덱스 0이고 두 번째 s는 메서드 이름 'toJSON'입니다.
당신이 디자인한 코드의 로직이 기본 Array 클래스를 기반으로 하고 어느 날 동료가 페이지에서 타사 JS 라이브러리를 참조하고 이 라이브러리가 우연히 Array 클래스를 확장한다면 결과는 상상할 수 없을 것이며 매우 위험합니다. 어쩌면 원래 코드 논리가 더 이상 유지되지 않을 수도 있습니다.
네이티브 JS 클래스를 확장하는 이러한 종류의 라이브러리와 관련하여 잘 알려진 라이브러리는 toJSON, Each 등과 같은 다양한 메서드를 Array 클래스로 확장하는 프로토타입.js입니다. 이제 나는 왜 jquery의 창시자가 프로토타입에 대해 그토록 화를 냈는지 이해합니다(많은 사람들이 특별한 이유로 같은 페이지에서 jquery와 프로토타입을 사용합니다. noCon충돌만으로는 해결할 수 없는 예상치 못한 충돌 문제가 많이 있을 것입니다.). 또한, jqModal의 작성자가 내 기사를 이해한다면 그는 아마도 프로토타입에 대해 불평하면서 다음과 같이 말할 것입니다. "배열 순회에 for in을 사용하는 것은 현명하지 못하지만 더 나쁜 것은 프로토타입입니다..."
As 위에서 언급했듯이, jqModal을 사용하고 있고 다른 이유로 프로토타입도 사용하고 있다면 축하합니다. 당신은 속은 것입니다. 충돌로 인해 jqModal의 팝업 상자는 ie6 및 ie7에서 closeClass에 의해 설정된 버튼을 사용하여 자동으로 닫힐 수 없습니다. 디버깅 코드를 추적하면 이 기사의 시작 부분에 언급된 hs 메서드의 for in 루프에 예외가 있음을 알 수 있습니다. . .
셋, 문제 해결
배열 순회 시 for in 대신 for var 문을 사용하세요.
위 내용은 javascript에서 for와 for in의 차이점과 for in이 권장되지 않는 이유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Root로 MySQL에 로그인 할 수없는 주된 이유는 권한 문제, 구성 파일 오류, 암호 일관성이 없음, 소켓 파일 문제 또는 방화벽 차단입니다. 솔루션에는 다음이 포함됩니다. 구성 파일의 BAND-ADDRESS 매개 변수가 올바르게 구성되어 있는지 확인하십시오. 루트 사용자 권한이 수정 또는 삭제되어 재설정되었는지 확인하십시오. 케이스 및 특수 문자를 포함하여 비밀번호가 정확한지 확인하십시오. 소켓 파일 권한 설정 및 경로를 확인하십시오. 방화벽이 MySQL 서버에 연결되는지 확인하십시오.

해시 값으로 저장되기 때문에 MongoDB 비밀번호를 Navicat을 통해 직접 보는 것은 불가능합니다. 분실 된 비밀번호 검색 방법 : 1. 비밀번호 재설정; 2. 구성 파일 확인 (해시 값이 포함될 수 있음); 3. 코드를 점검하십시오 (암호 하드 코드 메일).

백업 또는 트랜잭션 롤백 메커니즘이없는 한 데이터베이스에서 직접 삭제 된 행 복구는 일반적으로 불가능합니다. 키 포인트 : 거래 롤백 : 트랜잭션이 데이터를 복구하기 전에 롤백을 실행합니다. 백업 : 데이터베이스의 일반 백업을 사용하여 데이터를 신속하게 복원 할 수 있습니다. 데이터베이스 스냅 샷 : 데이터베이스의 읽기 전용 사본을 작성하고 데이터를 실수로 삭제 한 후 데이터를 복원 할 수 있습니다. 주의해서 삭제 명령문을 사용하십시오. 실수로 데이터를 삭제하지 않도록 조건을주의 깊게 점검하십시오. WHERE 절을 사용하십시오 : 삭제할 데이터를 명시 적으로 지정하십시오. 테스트 환경 사용 : 삭제 작업을 수행하기 전에 테스트하십시오.

Centos는 2024 년에 상류 분포 인 RHEL 8이 종료 되었기 때문에 폐쇄 될 것입니다. 이 종료는 CentOS 8 시스템에 영향을 미쳐 업데이트를 계속받지 못하게합니다. 사용자는 마이그레이션을 계획해야하며 시스템을 안전하고 안정적으로 유지하기 위해 Centos Stream, Almalinux 및 Rocky Linux가 포함됩니다.

MySQL의 킬 명령은 프로세스의 특별한 상태와 부적절한 신호 레벨로 인해 때때로 실패합니다. MySQL 프로세스를 효과적으로 종료하는 방법에는 다음이 포함됩니다. 프로세스 상태 확인, MySQLADMIN 명령 (권장) 사용, 킬 -9를주의해서 사용하고 시스템 리소스 확인 및 오류 로그의 심층 문제 해결 문제가 포함됩니다.

MariaDB 용 Navicat은 암호가 암호화 된 양식으로 저장되므로 데이터베이스 비밀번호를 직접 볼 수 없습니다. 데이터베이스 보안을 보장하려면 비밀번호를 재설정하는 세 가지 방법이 있습니다. Navicat을 통해 비밀번호를 재설정하고 복잡한 비밀번호를 설정하십시오. 구성 파일을 봅니다 (권장되지 않음, 위험이 높음). 시스템 명령 줄 도구를 사용하십시오 (권장되지 않으면 명령 줄 도구에 능숙해야 함).

Navicat은 보안상의 이유로 암호화 된 암호를 저장하기 때문에 Navicat에서 직접 PostgreSQL 암호를 보는 것은 불가능합니다. 암호를 확인하려면 데이터베이스에 연결하십시오. 암호를 수정하려면 PSQL 또는 Navicat의 그래픽 인터페이스를 사용하십시오. 다른 목적을 위해서는 하드 코딩 된 암호를 피하기 위해 코드의 연결 매개 변수를 구성해야합니다. 보안을 향상시키기 위해 강력한 비밀번호, 정기적 인 수정을 사용하고 다중 요소 인증을 활성화하는 것이 좋습니다.

Navicat Connection 타임 아웃의 이유 : 네트워크 불안정성, 바쁜 데이터베이스, 방화벽 차단, 서버 구성 문제 및 부적절한 Navicat 설정. 솔루션 단계 : 네트워크 연결, 데이터베이스 상태, 방화벽 설정을 확인하고 서버 구성 조정, NAVICAT 설정 확인, 소프트웨어 및 서버를 다시 시작한 후 관리자에게 문의하십시오.
