JavaScript 객체 속성의 존재성 및 열거성
2402 단어 javascript프런트엔드
존재성: 대상에 이 속성이 존재하는지 여부
이름상으로 볼 때 우선 이 대상이 이 대상에 존재해야만 매거할 수 있는지, 즉 존재성>매거형을 고려할 수 있다.
다음 코드의 결과를 생각해 보십시오.
var myObject = {
a:undefined
}
console.log(myObject.a); //?
console.log(myObject.b); //?
당신은 이미 답이 있다고 믿습니다. 두 속성 값은 모두
undefined
입니다. 그러나 대상 속성의 존재성과 매거성은 대상 속성이어야 하는데 속성 값을 말할 이유가 없습니까?myObject.a
와 myObject.b
모두undefined
였다.차이점: a는 대상 속성으로 존재하고 속성 값undefined
이지만 대상에서 b의 동명 속성을 찾지 못했기 때문에 심지어 원형 체인에도 존재하지 않을 수도 있고 되돌아왔다undefined
.그러면 이 두 가지 상황을 구분해 볼까요?즉 우리가 대상에 어떤 속성이 존재하는지 어떻게 판단하는가이다.var myObject ={
a:2
};
console.log( 'a' in myObject);// true
console.log( 'b' in myObject);// false
console.log(myObject.hasOwnProperty('a'));//true
console.log(myObject.hasOwnProperty('b'));//false
for(var prop in myObject){
if(prop==='a') console.log(true;)
} //true
Object.getOwnPropertyNames(myObject);//['a']
Object.keys();//['a']
in
는 속성이 대상과 [[Prototype]] 원형 체인에 존재하는지 검사하는 데 사용된다.obj.hasOwnProperty(…)
속성이 대상에 존재하는지 검사하기 위해 [[[Prototype]] 원형 체인을 검사하지 않습니다in
의 특수성:for...in
,Object.getOwnPropertyNames
,Object.keys()
를 두루 사용해서 대상의 모든 속성을 열거해 보았는데 그들은 어떤 차이가 있습니까?위의 코드를 수정했습니다.var myObject = {
a:2
}
Object.defineProperty(myObject,"a",{
enumerable:false
})
Object.defineProperty(myObject,"b",{
enumerable:true,
value:2
})
//----------------
for(var prop in myObject){
console.log(prop,myObject[prop]);
} //b 2
Object.getOwnPropertyNames(myObject);//['a','b']
Object.keys(myObject);//['b']
보시다시피 myObject에 속성 a가 확실히 존재하지만 옮겨다니지 않았습니다.이것은 현재 속성의 속성 설명자에 정의된
ennmerable
와 관련이 있습니다.대상을 정의할 때 대상의 속성은 기본적으로 모두 보입니다. 즉
ennmerable:true
특수한 속성을 차단하려면 false
로 수정할 수 있습니다.Object.keys() & Object.getOwnPropertyNames(…)
동일점: 대상이 직접 포함하는 속성만 찾고 원형 체인[[[Prototype]]에서 찾지 않습니다
차이점: Object.keys () 는 모든 열거 가능한 속성을 훑어봅니다
Object.getOwnPropertyNames(...)는 모든 객체 등록 정보를 통과합니다.
for...in은 대상과 원형 체인의 매개 속성을 옮겨다니는 데 사용됩니다.
이상의 분석을 통해 우리는 대상의 속성을 판단할 때 더욱 명확하게 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
개별 마크다운 블로그 페이지 만들기 - 13부이를 통해 개별 마크다운 기반 블로그 게시물 작성을 시작할 수 있습니다! 이 기사를 따르려면 을 시작점으로 사용하십시오. blog 페이지 디렉토리에 동적 페이지를 생성하여 시작할 수 있습니다. 이 파일[slug].j...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.