객체 속성을 확인하기 위해 JavaScript에 "not in"연산자가 있습니까?


183

JavaScript에 객체에 속성이 존재하지 않는지 확인하기위한 일종의 "not in"연산자가 있습니까? Google 또는 Stack Overflow에서 이것에 대해 아무것도 찾을 수 없습니다. 다음은 이런 종류의 기능이 필요한 곳에서 작업하는 코드 스 니펫입니다.

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

보시다시피, 나는 else진술 에 모든 것을 넣을 것 입니다. 부분 을 사용 하기 위해 ifelse문 을 설정하는 것은 나에게 잘못된 것 같습니다 else.


4
나는 당신이 var id = ...당신의 기능을 원할 것이라고 생각합니다 .
Cobby

답변:


338

else 부분을 사용하기 위해 if / else 문을 설정하는 것은 잘못된 것 같습니다 ...

조건을 무효화하면 다음과 같은 else논리를 얻을 수 있습니다 if.

if (!(id in tutorTimes)) { ... }

11
이 스타일은 또한 JSHint " '!'의 혼란스러운 사용!"경고를 수정합니다.( ! somekey in someobj )
mikemaccana

3
유의하시기 바랍니다 속성 이름을 검색 어디서나 프로토 타입 체인이다. 자세한 내용은 내 답변 을 참조하십시오.

25
나는 이것이 최선의 해결책이라는 것을 알고 있지만 다른 사람이 이것이 못생긴다는 ​​데 동의합니까?
요나

3
그것이 추악한 경우 그냥 기능에 포장하고 아름다운 이름을 줘let keyExists = (key, obj) => key in obj
Kamafeather

전적으로 동의합니다. 실제로 내 이름 기술도 향상시킬 수 있습니다. let hasProperty"더 잘 보인다"
Kamafeather

37

Jordão가 이미 말했듯이 그냥 무시하십시오.

if (!(id in tutorTimes)) { ... }

참고 : tutorTimes 에 프로토 타입 체인의 어디에서나 id에 이름이 지정된 속성이있는 경우 위의 테스트 입니다. 예를 들어 Object.prototype에 정의되어 있으므로 true"valueOf" in tutorTimes반환 합니다 .

현재 객체에 속성이 없는지 테스트하려면 hasOwnProperty를 사용하십시오.

if (!tutorTimes.hasOwnProperty(id)) { ... }

또는 hasOwnPropery 키가있는 경우 다음 을 사용할 수 있습니다.

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

키를 따옴표로 묶고 사용하는 것이 더 안전if(!tutorTimes.hasOwnProperty('id')) ... 합니까?
Majid Fouladpour

@MajidFouladpour id는 값을 가질 수있는 변수 이고 , id'id' 문자가 두 개인 문자열 이므로 변수 id에 지정된 속성 이 있는지 확인 하고 id라는 속성이 있는지 확인합니다. hasOwnProperty(id)hasOwnProperty('id')

17

개인적으로 찾은

if (id in tutorTimes === false) { ... }

보다 읽기 쉽다

if (!(id in tutorTimes)) { ... }

그러나 둘 다 작동합니다.


14

두 가지 빠른 가능성 :

if(!('foo' in myObj)) { ... }

또는

if(myObj['foo'] === undefined) { ... }

5
'undefined' === typeof xxx대신 사용하십시오 . undefined는 예약어가 아니며 실제로 덮어 쓸 수있는 전역 변수입니다 (버그를 찾기 어렵습니다)
hugomg

9
@hippietrail이 작동하지 않습니다 ... "!"다음에 괄호가 필요합니다. 주위'foo' in myObj)
Phil Cooper

4
myObj['foo']속성으로 존재하고 간단히 undefined(즉, 문으로 myObj.foo = undefined) 설정할 수 있습니다 . 속성 자체가 존재하지 않는지 확인하려면 !('foo' in myObj)표기법 이 필요합니다 .
Richard Connamacher

jsperf.com/not-in-vs-is-undefinedmyObj.foo === undefined : 우리 사이의 성능을 고려하면 검사 가 훨씬 빠릅니다 .
etpinard

@hugomg 나는 이것이 사용하지 않는 것에 대한 좋은 주장이라고 생각하지 않습니다 === undefined. 예를 들어 undefinedJavaScript 덮어 쓰기와 같은 작업을 수행하여 프로그래밍 언어를 남용하는 경우 많은 일이 중단 될 수 있습니다 . 또한보십시오 : stackoverflow.com/questions/8783510/…
Zero3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.