키가 JavaScript 객체에있는 키가 있는지 확인하는 것은 무엇입니까?


질문

 

특정 키가 JavaScript 오브젝트 또는 배열에 있는지 확인하려면 어떻게해야합니까?

키가 존재하지 않고 액세스하려고하면 FALSE를 반환합니까?또는 오류를 던지십니까?


답변

 

undefined-ness를 확인하는 것은 키가 있는지 여부를 정확하게 테스트하는 것이 아닙니다.키가 있지만 값이 실제로 정의되지 않은 경우에는 어떨까요?

var obj = {key : undefined}; console.log (obj [ "키"]! == undefined);// 거짓이지만 키가 존재합니다!

대신 운영자를 사용해야합니다.

var obj = {key : undefined}; console.log (obj의 "키");// 실제 가치에 관계없이 true

키가 존재하지 않는지 확인하려면 괄호를 사용해야합니다.

var obj = {not_key : undefined}; console.log (obj의 "키");// 객체에 "키"가 존재하지 않는 경우 true console.log (obj의 "키"키);// 이것을하지 마십시오!그것은 "obj의 거짓"과 같습니다.

또는 객체 인스턴스의 속성 (상속 된 속성이 아닌) 속성을 특히 테스트하려는 경우 hasownproperty를 사용하십시오.

var obj = {key : undefined}; console.log (obj.hasownproperty ( "키"));// 진실

HasownProperty와 Key가 정의되지 않은 메소드 간의 성능 비교를 위해이 벤치 마크를 참조하십시오.

javascript



답변

빠른 답변

특정 키가 JavaScript 오브젝트 또는 배열에 있는지 확인하려면 어떻게해야합니까? 키가없고 액세스하려고하면 FALSE를 반환 할 것입니까?또는 오류를 던지십니까?

(연관성) 배열 스타일 또는 오브젝트 스타일을 사용하여 누락 된 속성을 직접 액세스하면 정의되지 않은 상수가 반환됩니다.

운영자 및 HasownProperty 방법에서 느리고 신뢰할 수있는 방법

사람들이 이미 여기에 언급했듯이, "정의되지 않은"상수와 관련된 속성이있는 객체를 가질 수 있습니다.

 var bizzareObj = {valid_key:  undefined};

이 경우 키가 실제로 있는지 여부를 알기 위해 HasownProperty 또는 Operator를 사용해야합니다.하지만, 어떤 가격으로?

그래서, 나는 너에게 말한다.

운영자와 HasownProperty에서는 JavaScript에서 속성 설명자 메커니즘을 사용하는 "메소드"입니다 (Java 언어의 Java Reflement와 유사).

http://www.ecma-international.org/ecma-262/5.1/#sec-8.10.10.

속성 디스크립터 유형은 명명 된 속성 속성의 조작 및 재 지정을 설명하는 데 사용됩니다.속성 디스크립터 유형의 값은 각 필드의 이름이 속성 이름이고 해당 값은 8.6.1에 지정된 대응하는 해당 속성 값인 명명 된 필드로 구성된 레코드입니다.또한, 모든 필드는 존재하거나 부재 될 수 있습니다.

반면에 객체 메소드 또는 키를 호출하면 JavaScript [[get]] 메커니즘을 사용합니다.그것은 더 빨리 멀리 떨어져 있습니다!

기준

http://jsperf.com/checking-if-a-key-ex-in-a-javascript-array.

javascript

in
var result = "Impression" in array;

그 결과는

12,931,832 ±0.21% ops/sec      92% slower 
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

편집 : 정의되지 않은 값을 속성에 지정 해야하는 이유는 무엇입니까?

그 질문은 나를 퍼즐니다.JavaScript에서는 결석 된 객체에 대한 적어도 두 개의 참조가 있습니다. null 및 undefined.

NULL은 모든 객체 값의 의도적 인 부재를 나타내는 원시적 인 값이며 짧은 용어로 가치 부족이 부족합니다.반면에 정의되지 않은 값은 정의되지 않았습니다 (정의되지 않음).나중에 적절한 값으로 사용되는 속성이있는 경우 초기 순간에 속성이 값이없는 것으로 확인되므로 정의되지 않은 대신 null 참조를 사용하는 것이 좋습니다.

비교하다:

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[].

조언

정의되지 않은 값이있는 객체를 피하십시오.가능한 경우 직접 확인하고 NULL을 사용하여 속성 값을 초기화하십시오.그렇지 않으면 연산자 또는 hasownproperty () 메소드에서 느리게 사용하십시오.

편집 : 12/04/2018 - 더 이상 관련이 없습니다

사람들이 논평 한 것처럼 JavaScript 엔진 (Firefox 예외가있는)의 최신 버전은 액세스 속성에 대한 접근 방식을 변경했습니다.현재 구현은이 특정 사례에 대한 이전 제품보다 느리지 만 액세스 키와 객체의 차이는 무시할 수 있습니다.



답변

정의되지 않은 반환됩니다.

var aa = {안녕하세요 : "세계"}; 경고 (AA [ "Hello"]);// "세계"가있는 팝업 상자 경고 (AA [ "작별 인사"];// "undefined"가있는 팝업 상자

정의되지 않은 것은 특별한 일정한 값입니다.그래서 당신은 말할 수 있습니다, 예를 들어,

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

이것은 아마도 누락 된 키를 확인하는 가장 좋은 방법 일 것입니다.그러나 아래의 의견에서 지적한 것처럼 이론적으로 실제 값이 정의되지 않은 상태로 유지할 수 있습니다.나는 이것을 할 필요가없고 왜 원하는 이유를 생각할 필요가 없지만 완전성을 위해서만, 당신은 운영자를 사용할 수 있습니다.

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}


답변

"key" in obj

배열 키와 매우 다른 객체 속성 값 만 테스트 할 가능성이 있습니다.



답변

수락 된 답변은 물체를 나타냅니다.Array에서 in 연산자를 사용하여 키 대신 데이터를 찾습니다.

("true" in ["true", "false"])
// -> false (Because the keys of the above Array are actually 0 and 1)

배열의 기존 요소를 테스트하려면 : 항목이 JavaScript 배열에 있는지 확인하는 가장 좋은 방법은 무엇입니까?



답변

자바 스크립트 객체에 속성이 있는지 확인하는 세 가지 방법 :

  1. !!obj.theProperty
    Will convert value to bool. returns true for all but the false value
  2. 'theProperty' in obj
    Will return true if the property exists, no matter its value (even empty)
  3. obj.hasOwnProperty('theProperty')
    Does not check the prototype chain. (since all objects have the toString method, 1 and 2 will return true on it, while 3 can return false on it.)

참조:

http://book.mixu.net/node/ch5.html.

출처:https://stackoverflow.com/questions/1098040/checking-if-a-key-exists-in-a-javascript-object