JavaScript 객체 또는 배열에 특정 키가 있는지 어떻게 확인합니까?
키가 존재하지 않고 액세스하려고하면 false를 반환합니까? 아니면 오류를 던져?
답변
정의되지 않은 검사는 키가 있는지 여부를 테스트하는 정확한 방법이 아닙니다. 키가 있지만 실제로 값이 있으면 undefined
어떻게됩니까?
var obj = { key: undefined };
obj["key"] !== undefined // false, but the key exists!
대신 in
연산자 를 사용해야합니다 .
"key" in obj // true, regardless of the actual value
키가 존재하지 않는지 확인하려면 괄호를 사용해야합니다.
!("key" in obj) // true if "key" doesn't exist in object
!"key" in obj // ERROR! Equivalent to "false in obj"
또는 상속 된 속성이 아닌 객체 인스턴스의 속성을 특별히 테스트하려면 hasOwnProperty
다음을 사용하십시오 .
obj.hasOwnProperty("key") // true
있는 방법 사이의 성능 비교를 들어 in
, hasOwnProperty
키가 undefined
,이 볼 벤치 마크
답변
빠른 답변
JavaScript 객체 또는 배열에 특정 키가 있는지 어떻게 확인합니까? 키가 존재하지 않고 액세스하려고하면 false를 반환합니까? 아니면 오류를 던져?
(연관) 배열 스타일 또는 객체 스타일을 사용하여 누락 된 속성에 직접 액세스하면 정의되지 않은 값 이 반환됩니다 상수 됩니다.
느린하고 신뢰할 수 있는 연산자와 hasOwnProperty 방법
사람들이 이미 여기에서 언급했듯이 “정의되지 않은”상수와 연관된 속성을 가진 개체를 가질 수 있습니다.
var bizzareObj = {valid_key: undefined};
이 경우에는 hasOwnProperty 나 에 키가 정말이 있는지 알고 연산자를. 그러나 가격은 얼마입니까?
그래서 나는 당신에게 …
에 연산자와 hasOwnProperty 는 Javascript에서 속성 설명자 메커니즘을 사용하는 “메소드”입니다 (Java에서 Java 리플렉션과 유사).
http://www.ecma-international.org/ecma-262/5.1/#sec-8.10
속성 설명자 유형은 명명 된 속성 속성의 조작 및 수정을 설명하는 데 사용됩니다. 속성 설명자 유형의 값은 각 필드의 이름이 속성 이름이고 해당 값이 8.6.1에 지정된 해당 속성 값인 명명 된 필드로 구성된 레코드입니다. 또한 모든 필드가 있거나 없을 수 있습니다.
반면에 객체 메소드 또는 키를 호출하면 Javascript [[Get]] 메커니즘이 사용됩니다. 훨씬 빠릅니다!
기준
http://jsperf.com/checking-if-a-key-exists-in-a-javascript-array
.
사용 에 연산자
var result = "Impression" in array;
결과는
12,931,832 ±0.21% ops/sec 92% slower
hasOwnProperty 사용
var result = array.hasOwnProperty("Impression")
결과는
16,021,758 ±0.45% ops/sec 91% slower
요소에 직접 액세스 (브래킷 스타일)
var result = array["Impression"] === undefined
결과는
168,270,439 ±0.13 ops/sec 0.02% slower
요소에 직접 액세스 (객체 스타일)
var result = array.Impression === undefined;
결과는
168,303,172 ±0.20% fastest
편집 : 속성에 undefined
값 을 할당하는 이유는 무엇입니까 ?
그 질문은 나를 당혹스럽게한다. Javascript에는 다음 null
과 같은 문제를 피하기 위해 부재 객체에 대한 참조가 두 개 이상 undefined
있습니다.
null
는 객체 값의 의도적 인 부재 또는 단기적으로 확인 된 값 결여를 나타내는 기본 값입니다 . 한편, undefined
알 수없는 값 (정의되지 않음)입니다. 적절한 값으로 나중에 사용할 특성이있는 경우 초기 순간에 특성 에 값이없는 것으로 확인 되므로 null
대신 참조를 사용 하십시오 .undefined
비교:
var a = {1: null};
console.log(a[1] === undefined); // output: false. I know the value at position 1 of a[] is absent and this was by design, i.e.: the value is defined.
console.log(a[0] === undefined); // output: true. I cannot say anything about a[0] value. In this case, the key 0 was not in a[].
권하다
undefined
값이있는 물체는 피하십시오 . 가능할 때마다 직접 확인하고 null
속성 값을 초기화 하는 데 사용하십시오 . 그렇지 않으면 느린 in
연산자 나 hasOwnProperty()
방법을 사용하십시오 .
편집 : 2018 년 12 월 4 일-더 이상 관련이 없습니다.
사람들이 언급했듯이, 최신 버전의 Javascript 엔진 (firefox 제외)은 액세스 속성에 대한 접근 방식을 변경했습니다. 현재 구현은이 특별한 경우에 이전 구현보다 느리지 만 액세스 키와 객체의 차이는 무시할 수 있습니다.
답변
반환 undefined
됩니다.
var aa = {hello: "world"};
alert( aa["hello"] ); // popup box with "world"
alert( aa["goodbye"] ); // popup box with "undefined"
undefined
특별한 상수 값입니다. 예를 들어
// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
// do something
}
이것은 아마도 누락 된 키를 확인하는 가장 좋은 방법입니다. 그러나 아래 주석에서 지적했듯이 이론적으로 실제 값을 원할 수도 있습니다 undefined
. 나는 이것을 할 필요가 없었고 내가 왜 원했던 지 알 수없는 이유를 생각할 수는 없지만 완전성을 위해 in
연산자를 사용할 수 있습니다.
// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
// do something
}
답변
허용 대답 을 참조 객체 . 배열 대신 in
연산자 를 사용하여 키 대신 데이터를 찾으십시오.
("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)
배열에서 기존 요소를 테스트하려면 : 항목이 JavaScript 배열인지 확인하는 가장 좋은 방법은 무엇입니까?
답변
"key" in obj
배열 키와 매우 다른 객체 속성 값만 테스트 할 가능성이 있음
답변
자바 스크립트 객체에 속성이 있는지 확인하는 세 가지 방법 :
- !! obj.theProperty
값을 bool로 변환합니다. ‘false’값을 제외한 모든 값에 대해 TRUE를 반환합니다. - obj의 ‘theProperty’
는 값에 관계없이 속성이 존재하면 true를 반환합니다 (비어 있음). - obj.hasOwnProperty ( ‘theProperty’)
프로토 타입 체인을 확인하지 않습니다. (모든 객체에는 ‘toString’메서드가 있으므로 1과 2는 true를 반환하고 3은 false를 반환 할 수 있습니다.)
참고:
답변
underscore.js 라이브러리를 사용하는 경우 객체 / 배열 작업이 간단 해집니다.
귀하의 경우 _.has 메소드를 사용할 수 있습니다. 예:
yourArray = {age: "10"}
_.has(yourArray, "age")
true를 반환
그러나,
_.has(yourArray, "invalidKey")
거짓을 돌려 준다