객체가 jQuery 객체인지 확인


601

객체가 jQuery 객체인지 또는 기본 JavaScript 객체인지 확인하는 빠른 방법이 있습니까?

예:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

분명히 위의 코드는 작동하지만 안전하지 않습니다. 잠재적으로 o객체에 선택기 키를 추가 하고 동일한 결과를 얻을 수 있습니다. 객체가 실제로 jQuery 객체인지 확인하는 더 좋은 방법이 있습니까?

무엇인가 (typeof obj == 'jquery')


3
jQuery 3.0부터는 selector속성이 오래 전에 사용되지 않고 3.0에서 제거되었으므로 jQuery 객체 인 객체를 확인하는 올바른 방법은 아닙니다 . 이전 버전에서도 jQuery 객체에는 빈 선택기 문자열이있을 수 있습니다 (예 : $(window)선택기 없음). instanceof대신 사용하십시오 .
Dave Methvin

답변:


878

instanceof연산자 를 사용할 수 있습니다 :

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

설명 : jQuery함수 (일명 $)는 생성자 함수 로 구현됩니다 . 생성자 함수는 new접두사 로 호출해야 합니다.

당신이 호출 할 때 $(foo), 내부적으로 jQuery를은이 변환 new jQuery(foo)1 . JavaScript this는 생성자 함수 내에서 초기화 하여의 새로운 인스턴스를 가리키고 jQuery속성을 jQuery.prototype(aka jQuery.fn) 에있는 속성으로 설정합니다 . 따라서 is 인 new객체 를 얻습니다 .instanceof jQuerytrue


1 실제로 new jQuery.prototype.init(foo): 생성자 로직이이라는 다른 생성자 함수로 오프로드 init되었지만 개념은 동일합니다.


8
그러세요 if (obj instanceof jQuery){...}?
Nigel Angel

2
@NigelAngel : 그는 :) 무엇을 의미입니다 그래,
ChaseMoskal

12
페이지에 여러 jQuery 인스턴스가있는 경우 작동하지 않습니다.
Georgii Ivankin

5
@CrescentFresh jQuery2를 가리키는 현재 네임 스페이스에 $가 있고 외부 네임 스페이스 ($는 jQuery1)의 객체가 있는데이 객체가 jQuery 객체인지 확인하기 위해 instanceof를 사용할 수있는 방법이 없습니다.
Georgii Ivankin

6
당신이 jQuery를이 경우 문의 할 때로드되어 있지 있는지 여부, 당신이 될 수있는 체크 확장 할 수 typeof jQuery === 'function' && obj instanceof jQuery있기 때문에 jQuery위해서는 선언 할 필요가 없습니다 typeof오류를 던지고없이 작업에 연산자를.
Patrick Roberts

105

http://api.jquery.com/jquery-2/에 설명 된대로 .jquery 속성을 사용할 수도 있습니다.

var a = { what: "A regular JS object" },
b = $('body');

if ( a.jquery ) { // falsy, since it's undefined
    alert(' a is a jQuery object! ');    
}

if ( b.jquery ) { // truthy, since it's a string
    alert(' b is a jQuery object! ');
}

12
마찬가지로 다윗이 값이 null이 될 수있어 변수의 속성을 확인, 질문에서 지적 ( "a"또는 "b는"널 (null) 인 경우 예) 안전하지 않습니다 (그것은 형식 오류가 발생합니다). "b instanceof jQuery"를 사용하는 것이 좋습니다.
rstackhouse

23
이 방법은 jQuery가로드되지 않은 경우 작동하지만 b instanceof jQuery페이지에서 jQuery를 사용할 수없는 경우 ReferenceError를 발생시킵니다. 두 가지 방법 모두 다른 경우에 유용합니다.
Nate

더 효율적이지만 여전히 안전하지는 않습니다. try ... catch특히 oldIE에서이 필요할 수 있습니다 .
ClarkeyBoy

jQuery if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
가로

즉 이러한 좋은 예 아니다 .. 가능성이 a처럼 DOM 노드 것 document.body하고, 이론적으로 기회가 jquery키가 어떻게 든 그 노드의 체인의 한 ontop있게되었습니다.
vsync


26

객체의 인스턴스를 확인하는 가장 좋은 방법은 instanceof 연산자를 사용 하거나 객체의 프로토 타입이 다른 객체의 프로토 타입 체인에 있는지 검사하는 isPrototypeOf () 메소드 를 사용하는 것입니다.

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

그러나 때로는 문서의 여러 jQuery 인스턴스의 경우 실패 할 수 있습니다. @Georgiy Ivankin이 언급했듯이 :

만약 내가 $내 현재 이름 공간 가리키는 jQuery2내가 외부 네임 스페이스 (어디에서 개체를 가지고 $있다 jQuery1) 그때 사용할 수있는 방법이 없다 instanceof그 객체가있는 경우 확인하기 위해이 jQuery객체가

이 문제를 극복하는 한 가지 방법은 클로저 또는 IIFE 에서 jQuery 객체의 별칭을 지정하는 것입니다.

//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

그 문제를 극복하는 다른 방법 jqueryobj

'jquery' in obj

당신은 원시 값이 검사를 수행 할 경우 보장함으로써 이전의 검사를 수정할 수 있도록하지만, 그것은 오류가 발생합니다 obj을 수Object

'jquery' in Object(obj)

이전 방법이 가장 안전하지는 않지만 ( 'jquery'객체 에서 속성을 만들 수 있음 ) 두 가지 방법으로 작업하여 유효성을 향상시킬 수 있습니다.

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

문제는 여기에 모든 개체가 속성을 정의 할 수 있다는 것입니다 jquery더 나은 방법이 프로토 타입에 요청하는 것, 그래서 자신으로, 그리고 객체가 아닌지 확인 null또는undefined

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }

인해 강제if문을 평가하여 단락을 만들 &&때 조작자 obj의 어느 하나 falsy 값 ( null, undefined, false, 0, "")하고 다른 검증을 수행하기 위해 진행한다.

마지막으로 유틸리티 함수를 작성할 수 있습니다.

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}

살펴 보자 : 논리 연산자와 진실 / 거짓


그래도 안전은 어떻게 향상됩니까? jquery 속성을 가진 비 jQuery 객체는 여전히 잘못 감지됩니다. 두 가지 방법을 모두 사용하여 "개선"할 수있는 것이 무엇인지 알 수 없습니다.
Gui Prá

이것은 객체가 jQuery 객체인지 여부를 확인하는 쉬운 방법입니다. 어떤 이유로 누군가 jquery 와 같은 속성을 가진 객체를 생성하는 것으로 의심되는 경우 프로토 타입 에서 속성을 확인하는보다 강력한 유효성 검사기를 만들 수 있습니다 . myObj .constructor.prototype.jquery 또는 더 나은 기능은 Object.prototype.isPrototypeOf ()
jherax

1
당신이 경우 ||A의 그 어떤 것도는 'jquery' in Object(obj)하지만, 그것은 아닌 jQuery를이 검증을 통과하는 해당 속성과 개체를 방지하지 않기 때문에, 배수 간다. 그러나 프로토 타입에서 해당 속성을 확인하면 상황이 개선된다고 생각합니다. 아마 당신은 당신의 대답에 그것을 추가해야합니다! 나는 여기에 다른 대답이 있다고 생각하지 않습니다 :)
Gui Prá

1
없는 obj.__proto__.jquery대신은 obj.constructor.prototype.jquery충분? 그냥 조금 짧은 :)
Axel

1
@ Axel 예, 작동합니다 :). 생성자의 인스턴스 constructor.prototype이기 때문에 사용 되었습니다 . 반면 에 모든 종류의 객체에 사용할 수 있습니다. objjQuery__proto__
jherax

3
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);

DOM 요소, 더 나은 사용을 확인하려면 nodeType재산 및 보장하기 위해 boolean값이 반환, 당신은 이중 부정 사용할 수 있습니다!!(el && el.nodeType)
jherax

3

그러나 jQuery에서 객체를 확인하는 또 다른 방법이 있습니다.

jQuery.type(a); //this returns type of variable.

나는 것들을 이해하기 위해 모범을 보였습니다.


2

jQuery가 설치되지 않은 객체가 jQuery 객체인지 알고 싶은 경우 다음 스 니펫이 작동해야합니다.

function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}

1

jquery속성을 사용하여 JQuery가 객체를 생성하는지 확인할 수 있습니다 .

myObject.jquery // 3.3.1

=> 객체가 JQuery에 의해 생성 된 경우 JQuery 버전의 번호를 반환합니다. 그렇지 않으면 =undefined


-9
var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE

11
설명이없는 코드 덤프는 거의 유용하지 않습니다. 답변에 컨텍스트를 추가하십시오.
Chris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.