자바스크립트에서 객체에 특정 프로퍼티가 있는지 확인하려면 어떻게 해야 하나요?
생각해 보세요:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
이것이 가장 좋은 방법인가요?
이후, code> < 사용하여 hasOwnProperty< /code>;; 요소라고 할 수 있는 방법, 내가 원하는 건 대체 할 수 있는 방식 그리웠댔지 너회들 다음 해결책:
var obj = {
a: undefined,
b: null,
c: false
};
// a, b, c all found
for ( var prop in obj ) {
document.writeln( "Object1: " + prop );
}
function Class(){
this.a = undefined;
this.b = null;
this.c = false;
}
Class.prototype = {
a: undefined,
b: true,
c: true,
d: true,
e: true
};
var obj2 = new Class();
// a, b, c, d, e found
for ( var prop in obj2 ) {
document.writeln( "Object2: " + prop );
}
function hasOwnProperty(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
}
if ( Object.prototype.hasOwnProperty ) {
var hasOwnProperty = function(obj, prop) {
return obj.hasOwnProperty(prop);
}
}
// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
if ( hasOwnProperty(obj2, prop) ) {
document.writeln( "Object2 w/ hasOwn: " + prop );
}
}
위의 크로스 브라우저 솔루션을 개발하고,,,, 한 < code> hasOwnProperty< /code> 경고: 원형 (prototype) 와 동급의 경우를 구별할 수 없다는 속성을 켜있을 인스턴스에 대한 - 그냥 # 39 의 프로토타입 오는 it& 가정합니다. 상황에 따라 엄격한 관대한 수 있도록, 또는 shift+ctrl 수 있지만, 최소한 더 도움됐네 되어야 합니다.
1 와 ['언더스코엘가이스'] 또는 ([더욱] (https://stackoverflow.com/q/13789618/19212)) '로다시':
_.has(x, 'key');
그러나 (a) ',' 오브ject.프로토티페스트라운프로페티 페이징됩니다 입력할 수 있는 기간이 짧은, (b) ',' 안전한 참조입니다 해스운프로페티 " " 사용합니다. (즉 작동하잖아 해스운프로페티 경우에도 '' 덮어쓰여집니다).
특히 _.has 로다시 eventtest '' 다음과 같습니다.
function has(object, key) {
return object ? hasOwnProperty.call(object, key) : false;
}
// hasOwnProperty = Object.prototype.hasOwnProperty
'한 것은 정의되지 않은' 가 있다는 것을 명심해야 (외람되나) JavaScript 에서 예약어입니다 엄격한 모드를 사용하지 않는 경우. 따라서 누군가 (다른 사람이, 분명히) 할 생각을 이 코드에 천불이야 재정의하지 돌파했다.
따라서 보다 강력한 방법은 다음과 같습니다.
if (typeof(x.attribute) !== 'undefined')
또한, 이 방법은 대한 자세한 정보 및 때는기대어 뒤집기 훨씬 더 느리게 간다. :-/
(function (undefined) {
… your code …
if (x.attribute !== undefined)
… mode code …
})();
if (x.key !== undefined)
아민 로나허가 이미 저보다 앞서서 이 문제를 해결한 것 같지만요:
Object.prototype.hasOwnProperty = function(property) {
return this[property] !== undefined;
};
x = {'key': 1};
if (x.hasOwnProperty('key')) {
alert('have key!');
}
if (!x.hasOwnProperty('bar')) {
alert('no bar!');
}
콘라드 루돌프]4와 아르민 로나허가 지적한 것처럼3 더 안전하지만 느린 해결책이 될 것입니다:
Object.prototype.hasOwnProperty = function(property) {
return typeof this[property] !== 'undefined';
};
작동 여부를 확인할 수 있는 '에서 사용할 수 있습니다' 객체에 대한 속성:
x = {'key': 1};
alert("key" in x);
또한, 즉 '루프 (loop)' 을 통해 모든 객체의 속성을 사용하여 확인할지 후 특정 속성:
for (prop in x) {
if (prop == "key") {
//Do something
}
}
이 때문에 비사양 열거 특성을 고려해야 합니다 표시되지 않을 경우 객체에는 열거 방관하겠나 속성은 '에 대한 인' 루프지 또한, 만약 한 열거 속성은 섀도잉 비사양 열거 재산에 원형 (prototype), it 에 표시되지 않을 internet& explorer&; 빨리, 빨리, 8 와 있다.
하려면 모든 인스턴스 속성을 목록을 열거 방관하겠나 관계없이 사용할 수 있습니다.
Object.getOwnPropertyNames(x);
이 반환되므로 배열입니다 객체를 존재하는 모든 속성의 이름을.
마지막으로, 수행되는 연산자입니다 확인란 객체의 데이터 유형이 속성을 직접 사용할 수 있습니다.
if (typeof x.key == "undefined") {
alert("undefined");
}
String 객체에 대한 속성 존재하지 않는 경우, 이 반환되므로 정의되지 않았습니다. 또 다른 반품해야 적절한 속성 유형. 그러나 이것이 유효한 방법이 있는지 확인하는 것이 항상 충족되었으며 객체에는 속성 속성 때문에 방관하겠나 외상때문에 정의되지 않은, 이 경우 '으로 설정된 사용하여 메리 페로프 여전히 스스키 복귀하십시오' true (경우에도 여전히 주요 객체에는).
업데이트: Javascript 를 비교하여 정의되지 않은 속성 속성 존재 여부를 확인할 수 있습니다.
if (x.key === undefined) {
alert("undefined");
}
이 경우는 특별히 노력해야 한다는 것은 정의되지 않은 '의' x 객체에는 설정되었습니다 키
이름이 '속성' 해스운프로페티 되돌려줍니다 전달할 수 있으면 참 추가되었음 객체에는. 이것은 완전히 독립적으로 실제값 할당되어 정의되지 않은 '정확히' 있을 수 있음.
var o = {}
o.x = undefined
var a = o.hasOwnProperty('x') // a is true
var b = o.x === undefined // b is also true
var o = {}
var a = o.hasOwnProperty('x') // a is now false
var b = o.x === undefined // b is still true
문제는 객체의 속성을 가지고 있을 때 일어나는 프로토타입 (chain) 의 값이 정의되지 않은? '거짓' 을 위한 정보기술 (it), '! = 정의되지 않은' 해스운프로페티 있을 것입니다. 그러나 여전히 'for.in' 은 이 열거도 목록.
The bottom line 은 크로스 브라우저 운행에서어떠한 없다 (이후 '노출' prototype Internet& doesn& # 39, t, nbsp, Explorer) 것을 확인할 수 있는 객체 또는 어떤 특정 식별자입니다 프로토타입 체인으로 연결된 적이 있다.
속성에 대해 검색하였다면 관심용 NO" ";). 운영까지도:
if ('prop' in obj) { }
일반적으로 원형 (prototype) 또는 객체에는 등록 여부를 잘 안됩니다 비롯됩니다.
그러나 # 39, & # 39 key& 사용할 수 있기 때문에, 마치 틀렸다니까 로케이터로 다룰 수 있는 샘플 코드, 해시, 이 경우 대답을 할 것이라고 한다. 모든 해시 키를 약간만이라도 속성에 의해 평가를 받고 있으며, 추가 특성는 프로토타입 객체에는 방지할 수 있습니다.
존 Resig& # 39 는 아주 포괄적인 있지만, s, t # 39 죽여줬어 wasn& 답을 줄 알았는데. # 39, & # 39 prop& 함께 사용하는 경우, 특히 ". 의 obj".
간단한 테스트를 위한 객체에는 사용:
다른 모든 옵션을 속도가 느려집니다.
성능 평가에 따라 다른 노데지스 100,000,000 주기 위해 5 제안한 옵션이 있습니다.
function hasKey1(k,o) { return (x in obj); }
function hasKey2(k,o) { return (obj[x]); }
function hasKey3(k,o) { return (obj[x] !== undefined); }
function hasKey4(k,o) { return (typeof(obj[x]) !== 'undefined'); }
function hasKey5(k,o) { return (obj.hasOwnProperty(x)); }
우리는 특히 있음을 알려 준다는 평가를 한 확인하려는 object& # 39 의 프로토타입 체인을 사용하여 객체에는 자체를 하지 않고 있을 뿐 아니라 일반 양식: It if (X) 의 Obj) '.' 는 2 대 6 번 사이에 느린 따라 览侩 荤례
hasKey1 execution time: 4s 510.427785ms
hasKey2 execution time: 0s 904.374806ms
hasKey3 execution time: 0s 760.336193ms
hasKey4 execution time: 0s 935.19901ms
hasKey5 execution time: 2s 148.189608ms
요컨대, Obj 경우 simple object 아니다 # 39 의 프로토타입 체인 및 검사 및 프로파일링하려는 object& 피할 수 있도록 직접 소유하고 있고, 사용 및 # 39 개 목표 (로비스트라운프로페티 (x)), 만약 .& # 39;.
그렇지 않으면 simple object 와 object& # 39 에 대한 우려가 없는 사용할 때 사용하는 경우, 프로토타입 체인 ' (메리 페로프 (obj [x]), # 39, & # 39 undefined&! =).' 가장 안전한 및 빠른 방법입니다.
간단한 해시 테이블을 사용하는 경우, "만약 내가 아무 짓도 안 로케이터로 등으로 사용하게 된다. (obj [x]) '를 찾아 내가 훨씬 더 판독값.
즐거운 시간 되세요
'이' 객체에는 ES6 설명하노라 을 사용할 수도 있습니다.
x = {'key': 1};
Reflect.has( x, 'key'); // returns true
'' 에 관한 문서가 매든 세레스트리아스 korea. 여기서요 .
>. 이 같은 방식은 '정적' 세레스트리아스 () 함수로 in 작동자.
이렇게 하지 '오브ject.하스운프로페티 (키))', 그 때문에 이러한 방식이 그렇게 안 될 문제가 있는 객체에 대한 등록 정보순으로 그림자 ' {포지셔닝합니다 해스운프로페티: 객체에는 거짓값} '또는' (오브ject.크레이트 (null)) 'null 개체 수 있습니다.
가장 좋은 방법은 오브ject.프로토티페스트라운프로페티스콜 못하며창조된 ' (오브젝트, 키)' 또는 '.
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
// ...
console.log(has.call(object, key));
해스운프로페티 " 여부를 결정하는 데 사용될 수 있습니다, 지정된 해당 객체의 속성 속성 객체에는 직접판매용 있다. 에서 달리, 이 방법은 작동자 # 39 의 프로토타입 chain." object& 아래로 확인하지 않습니다.
그래서 대부분의 아마도 뭐하러요 질문을 통해 사용할 수 없는 것 같다, don& # 39 로 존재하는 경우 직접 결정하는 해스운프로페티 속성 자체가 , 첨부되었는지 객체에는.
스케쳐내 프로토타입 체인 너회가 주 에서 사용할 수 있는지 여부를 결정할 수 있는 속성, 다음과 같습니다.
if( prop in object ){ // do something }
이렇게 하면 좋겠다.
비교적 간단한 방법으로 사용하고 다른 '로비치스키스'. 이 '즉' 을 반환하는지 어레이입니다 어레이에서는 기능을 모두 활용할 수 있습니다.
var noInfo = {};
var info = {something: 'data'};
Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true
비록 지금은 세계 뛰어난 브라우저 지원. 이 질문은 너무 오래된 생각해봤죠 I&; d # 39 이 때문에 추가: 이것은 [JS v1.8.5] [2] vmware. 안전하게 사용할 수 있습니다
[2]: # 로비치스키스 http://kangax.github.io/compat-table/es5/
여기에 또 다른 옵션은 구체적 사건에 대한 위험이 있는 벽돌이날아와 다운보팅. )
스케쳐내 테스트하려면 멤버 및 it 설정되었습니다 이외의 다른 객체에 대한 있는건가요.
그 후 사용할 수 있습니다.
var foo = {};
foo.bar = "Yes, this is a proper value!";
if (!!foo.bar) {
// member is set, do something
}
다음과 같은 방식을 사용할 수 있습니다 -
var obj = {a:1}
console.log('a' in obj) //1
console.log(obj.hasOwnProperty('a')) //2
console.log(Boolean(obj.a)) //3
이 차이를 다음과 같이 다음 접근 방식은 -
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var obj = {
a:2,
__proto__ :{b:2}
}
console.log('b' in obj)
console.log(Boolean(obj.b))
끝 - < 스니핏 >;!
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var obj = {
a:2,
__proto__ :{b:2}
}
console.log(obj.hasOwnProperty('b'))
끝 - < 스니핏 >;!
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var obj = {
b : undefined
}
console.log(Boolean(obj.b))
console.log('b' in obj);
끝 - < 스니핏 >;!
Hasownproperty" " 메서드로부터 있습니다;; 그러나 그 때문에 이 방법을 직접 호출할 수 있는 개체 수 없는 권장됨 가끔 객체에는 널임 또는 어떤 부동산 존재하는 개체 다음과 같습니다. ' {해스운프로페티: 거짓값} '
그래서 더 나은 방법이 될 것 "이라고 말했다.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
// good
var obj = {"bar": "here bar desc"}
console.log(Object.prototype.hasOwnProperty.call(obj, "bar"));
// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(obj, "bar"));
끝 - < 스니핏 >;!
ECMA 스크립트 6 솔루션과 숙고하리라 다음과 같은 래퍼 생성
/**
Gets an argument from array or object.
The possible outcome:
- If the key exists the value is returned.
- If no key exists the default value is returned.
- If no default value is specified an empty string is returned.
@param obj The object or array to be searched.
@param key The name of the property or key.
@param defVal Optional default version of the command-line parameter [default ""]
@return The default value in case of an error else the found parameter.
*/
function getSafeReflectArg( obj, key, defVal) {
"use strict";
var retVal = (typeof defVal === 'undefined' ? "" : defVal);
if ( Reflect.has( obj, key) ) {
return Reflect.get( obj, key);
}
return retVal;
} // getSafeReflectArg