Проверьте, существует ли объект в JavaScript


314

Как мне проверить существование объекта в JavaScript?

Следующие работы:

if (!null)
   alert("GOT HERE");

Но это выдает ошибку:

if (!maybeObject)
   alert("GOT HERE");

Ошибка:

maybeObject не определен.

Ответы:


579

Вы можете безопасно использовать typeofоператор для неопределенных переменных.

Если ему было присвоено какое-либо значение, включая null, typeof вернет что-то отличное от undefined. typeof всегда возвращает строку.

Следовательно

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

73
если это всегда строка, вы действительно можете (должны) сделать !==для сравнения.
Михей

9
Так как это основная функция Javascript, обидно, что нет лучшей и менее подверженной ошибкам встроенной функции. Сравнение строк не позволяет компилятору на 100% достоверно сообщить нам, когда мы допустили небольшую ошибку (например, опечатку) в таких проверках.
Доми

в моем случае я ищу ПОИСК для этого объекта, так что это не помогает. я хочу решение, которое я могу использовать в консоли, а также, чтобы увидеть, если объект находится в domtree где-то без каких-либо clickery ..
блин

@TJCrowder Эти примеры, кажется, больше не доступны.
Стефан ван ден Аккер

1
@StefanvandenAkker: ссылка на плохой пример должна быть на jsbin.com/ibeho3/1 . Хороший пример был хорош: jsbin.com/ibeho3/2 . (К сожалению, JSBin перенаправляет к последнему, и люди редактировали это с точностью до дюйма его жизни.)
TJ Crowder

48

Здесь много полуправды, поэтому я решил кое-что прояснить.

На самом деле вы не можете точно сказать, существует ли переменная (если вы не хотите обернуть каждую вторую строку в блок try-catch).

Причина в том, что Javascript обладает этим пресловутым значением, undefinedкоторое поразительно не означает, что переменная не определена или что она не существуетundefined !== not defined

var a;
alert(typeof a); // undefined (declared without a value)
alert(typeof b); // undefined (not declared)

Так что и переменная, которая существует, и другая, которая не может сообщить вам undefined тип.

Что касается заблуждения @ Кевина null == undefined. Это происходит из-за приведения типов, и это основная причина, по которой Крокфорд постоянно говорит всем, кто не уверен в подобных ===вещах, всегда использовать оператор строгого равенства для проверки возможных ложных значений. null !== undefinedдает вам то, что вы могли ожидать. Также обратите внимание, что это foo != nullможет быть эффективным способом проверить, является ли переменная undefinedниnull . Конечно, вы можете быть явным, потому что это может помочь читабельности.

Если вы ограничите вопрос проверкой существования объекта, это typeof o == "object"может быть хорошей идеей, за исключением случаев, когда вы не учитываете объекты массивов, так как это также будет сообщать о типе, objectкоторый может вас немного запутать. Не говоря уже о том, typeof nullчто также даст вам, objectчто просто неправильно.

Первобытная область , где вы действительно должны быть осторожными typeof, undefined, null, unknownи другие misteries объекты хозяина. Им нельзя доверять. Они свободны делать почти любую грязную вещь, которую хотят. Поэтому будьте осторожны с ними, проверьте функциональность, если можете, потому что это единственный безопасный способ использовать функцию, которая может даже не существовать.


5
Простое выполнение foo!=nullприведет к возникновению ошибки ReferenceError, если fooона не определена. Таким образом, лучше использовать typeof, если вы не планируете ловить исключение.
JAL

1
Я снова записываю это для вас: undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null' . Я не сказал, что != nullэто хорошо для проверки, если она существует. Вы вынимаете это из контекста. (Я также упомянул, что это sidenote, не строго связанный с предметом вопроса ОП)
gblazex

2
Вы снова путаете термин, не определенный с типом undefined. Они не одинаковы. (note) it can be used !== you should use, Используйте здравый смысл при чтении. Когда переменная объявлена ​​(список параметров или где-либо еще), и вы хотите проверить, есть ли у нее значение, !=null полностью безопасен. Это другой вариант использования, нежели тот, о котором просил ОП, поэтому я представил его в качестве примечания. Весь параграф о посте @ Kevin и принуждении к типу между прочим. Как вы можете заметить, если вы внимательно прочитали.
gblazex

@JAL вы пропускаете ту часть, которую вы не рискуете использовать, != nullкогда знаете, что переменная объявлена. Это очень полезно для проверки аргументов функций, рассмотрим:var hasValue = function(foo) {return foo != null}
tybro0103

@ tybro0103 это правда, но вся проблема в том, «Как мне проверить существование объекта в JavaScript?». Если вы уверены, что это было объявлено, это другая ситуация.
JAL


8

Два пути.

typeof для локальных переменных

Вы можете проверить локальный объект, используя typeof:

if (typeof object !== "undefined") {}

окно для глобальных переменных

Вы можете проверить глобальный объект (определенный в глобальной области), проверив объект окна:

if (window.FormData) {}



4

Тема была открыта довольно давно. Тем временем я думаю, что использование троичного оператора является самым простым вариантом:

maybeObject ? console.log(maybeObject.id) : ""

Да, что-то вроде var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;и проверьте, если нет false.
Hmerman6006

3

Раньше я просто делала if(maybeObject)проверку нуля в моих javascripts.

if(maybeObject){
    alert("GOT HERE");
}

Таким образом, только если maybeObject- это объект, предупреждение будет показано. У меня есть пример на моем сайте.

https://sites.google.com/site/javaerrorsandsolutions/home/javascript-dynamic-checkboxes


Проблема в том, что если возможно, объект не был объявлен, он выдаст ошибку: возможно, объект не определен
Хуанма Менендес,

если maybeObjectесть 0, 0.0, or "", проверяется на ложность
alejandrociatti

3

Я только что протестировал примеры typeOf сверху, и ни один из них не работал для меня, поэтому вместо этого я использовал это:

    btnAdd = document.getElementById("elementNotLoadedYet");
    if (btnAdd) {
       btnAdd.textContent = "Some text here";
    } else {
      alert("not detected!");
    }


1

Помимо проверки существования объекта / переменной вы можете захотеть предоставить вывод «наихудшего случая» или, по крайней мере, поместить его в предупреждение, чтобы оно не осталось незамеченным.

Пример функции, которая проверяет, предоставляет альтернативы и выявляет ошибки.

function fillForm(obj) {
  try {
    var output;
    output = (typeof obj !== 'undefined') ? obj : '';
    return (output);
  } 
  catch (err) {
    // If an error was thrown, sent it as an alert
    // to help with debugging any problems
    alert(err.toString());
    // If the obj doesn't exist or it's empty 
    // I want to fill the form with ""
    return ('');
  } // catch End
} // fillForm End

Я создал это также потому, что передаваемый ему объект мог быть x, xm, xm [z], а typeof xm [z] потерпит неудачу с ошибкой, если xm не существует.

Я надеюсь, что это помогает. (Кстати, я новичок в JS)


1

для меня это сработало для DOM-объекта:

if(document.getElementsById('IDname').length != 0 ){
   alert("object exist");
}

1

Если вы заботитесь только о его существовании (было ли оно объявлено?), Достаточно утвержденного ответа:

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

Если вас волнует фактическое значение, вы должны добавить:

if (typeof maybeObject != "undefined" && maybeObject != null ) {
   alert("GOT THERE");
}

Так как typeof( null ) == "object"

например bar = { x: 1, y: 2, z: null}

typeof( bar.z ) == "object" 
typeof( bar.not_present ) == "undefined" 

Таким образом , вы убедитесь , что это не ни nullили undefined, и так как typeofне ошибка , если значение не существует плюс&& короткого замыкания, вы никогда не получите ошибку во время выполнения.

Лично я бы предложил добавить куда-нибудь помощника fn (и давайте не будем доверять typeof()):

function exists(data){
   data !== null && data !== undefined
}

if( exists( maybeObject ) ){
    alert("Got here!"); 
}

0
if (n === Object(n)) {
   // code
}

5
Хотя этот блок кода может ответить на вопрос ОП, этот ответ будет гораздо полезнее, если вы объясните, чем этот код отличается от кода в вопросе, что вы изменили, почему вы его изменили и почему это решает проблему. не представляя других.
Mifeet


-1

установите значение Textbox равным одному кадру для встроенного кадра, используя панель вкладок div alignmnt. Прежде всего, перед тем, как установить значение, нам нужно проверить, доступен ли выбранный фрейм с вкладками или нет следующих кодов:

Код Javascript:

/////////////////////////////////////////
<script>

function set_TextID()
            {
                try
                    {
                        if(!parent.frames["entry"])
                            {
                            alert("Frame object not found");    
                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["entry"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["education"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["education"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["contact"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["contact"].document.getElementById("form_id").value=setText;
                            }

                        }catch(exception){}
                }

</script>

-1

ноль и ноль являются неявными указателями. Если вы не выполняете арифметику, сравниваете или выводите «0» на экран, нет необходимости его набирать. Это неявное. Как и подразумевается. Typeof также не требуется по той же причине. Смотреть.

if (obj) console.log ("существует");

Я не видел запрос на нет или еще там, поскольку он не включен как. Столько, сколько я люблю дополнительный контент, который не вписывается в вопрос. Давайте будем проще.


Я вижу не в вопросе: if (!maybeObject)- но действительно, название требует обратного.
Армали

-4

Думаю, так проще всего

if(myobject_or_myvar)
    alert('it exists');
else
   alert("what the hell you'll talking about");

-10

Или, вы все можете начать использовать мой эксклюзивный exist () вместо этого метод и иметь возможность делать вещи, которые считаются невозможными. то есть:

Такие вещи, как: exists("blabla")или даже: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")также возможны ...


4
И где этот метод?
v010дя
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.