1. 판단 objectName의 구문
prop
objectName이 가리키는 객체에 prop 속성이나 키 값이 포함되어 있으면 in 연산자는 true를 반환합니다.
var arr = ['one',' two', ' three','four'];
arr.five = '5';
0 in arr;//true
'one' in arr;
arr;//true에서 'five'가 판단될 수 있습니다. 'five'는 arr 객체의 속성입니다
arr;//true에서 'length'
프로토타입 체인
in 연산자 주어진 prop 속성
Object.prototype.sayHello = 'hello,world';
var foo = new Object()
'sayHello' in foo;//true; >'toString' in foo;//true;
'hasOwnProperty' in foo;//true;
객체 및 리터럴
객체를 처리할 때 in 연산자가 제대로 작동하지 않습니다. 및 특정 유형의 리터럴(문자열, 숫자)
var sayHelloObj = new String('hello,world');
var sayHello = 'hello,world'
var numObj = new Number(1)
var num = 1; >
sayHelloObj의 'toString' //true
sayHello의 'toString'; //입력 오류
'toString' in numObj;//true
'toString' in num; //유형 오류
그 이유는 MDN에서 String 개체 및 리터럴 변환에 대한 소개를 찾았기 때문입니다. 이 소개는 이 이유를 설명하는 것 같습니다.
JavaScript가 자동으로 변환하기 때문입니다. 문자열 기본 요소와 문자열 개체 사이에서 문자열 기본 요소에 대한 String 개체의 메서드를 호출할 수 있습니다. JavaScript는 자동으로 문자열 기본 형식을 임시 String 개체로 변환하고 해당 메서드를 호출한 다음 임시 String 개체를 삭제합니다. 문자열 리터럴에서 생성된 문자열 기본 요소에 String.length 속성을 사용할 수 있습니다.
이렇게 이해해 보세요. in은 메서드가 아니라 연산자이기 때문에 문자열 리터럴은 자동으로 String 개체로 변환될 수 없습니다. in 연산자의 쿼리 객체는 객체가 아니라 문자열(베테랑 Douglas에 따르면 객체와 유사한 유형일 뿐임)이므로 유형 오류가 보고됩니다.
2. 순회
는 매우 일반적으로 사용되는 for...in 루프 문입니다. 이 문의 in은 다른 문법 사양을 따라야 합니다.
for(객체의 변수)
문
in을 연산자로 단독으로 사용하는 것과 달리 for...in 루프 문은 프로토타입 체인의 사용자 정의 속성을 포함한 사용자 정의 속성만 순회합니다. toString과 같은 내장 속성이 탐색됩니다.
객체
function Bird (){
this.wings = 2;
this.feet = 4;
this.flyable =
}
var Chicken = new Bird(); flyable = false ;
for(var p in Chicken){
alert('chicken.' p '=' Chicken[p])
}
문자열 개체, 테스트된 Firefox, Chrome, Opera 및 Safari 브라우저는 모두 댓글에 결과를 제공하지만 IE 브라우저만 '자세히' 및 '세계'만 제공합니다.
str.more = 'world'
for(var p; in str){
alert(p);//'more',0,1,2,3,4
alert(str[p]);//'world','h','e ' ,'l','l','o'
}
리터럴
배열 리터럴의 키 값과 속성 순회
arr.five = '5';
for(var p in arr){
alert(arr[p]);//'1','2','3' ,'four',' five'
}
문자열 리터럴을 탐색합니다. 문자열 리터럴 앞에 in 연산자만 사용하면 유형 오류가 보고되지만 다음 코드는 정상적으로 실행될 수 있습니다. . 이때 IE 브라우저는 무음입니다
코드 복사
코드는 다음과 같습니다
var str = 'hello';
str.more = 'world'
for(var p in str){
alert(p);//0,1,2 ,3,4
alert(str[p]);//'h','e','l','l','o'
}
일반
ECMA에는 이와 관련된 사양이 있지만 여전히 브라우저마다 차이가 있습니다. 이를 고려하여 for...in을 사용하여 문자열을 순회하는 것은 권장되지 않으며 배열을 순회하는 것도 권장되지 않습니다. 예) 배열에 사용자 정의 속성을 추가하면 순회가 엉망이 될 것임을 나타냅니다.
객체 순회 측면에서 객체의 내장 메소드 hasOwnProperty()를 사용하여 객체의 속성을 제외할 수도 있습니다. 순회 속도를 더욱 높이고 성능을 향상
function Each(object, callback, args) {
var prop;
for( prop in object ){
if( object.hasOwnProperty( i ) ){
callback.apply( prop , args )
}
}
}