Перевірте, чи існує об’єкт у JavaScript


313

Як я можу перевірити наявність об'єкта в JavaScript?

Наступні роботи:

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

Але це призводить до помилки:

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

Помилка:

maybeObject не визначено.

Відповіді:


578

Ви можете безпечно використовувати typeofоператора на невизначених змінних.

Якщо йому було призначено будь-яке значення, включаючи null, typeof поверне щось інше, ніж невизначене. typeof завжди повертає рядок.

Тому

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

73
якщо це завжди рядок, ви дійсно могли (повинні) зробити !==для порівняння.
Міхе

9
Оскільки це основна функція Javascript, прикро, що не існує кращої та менш схильної до помилок вбудованої. Порівняння рядків заважає компілятору на 100% надійно сказати нам, коли ми зробили невелику помилку (наприклад, помилку друку) у таких видах перевірок.
Домі

у моєму випадку я шукаю ПОШУК для цього об’єкта, тому це не допомагає. я хочу рішення, яке я можу використовувати в консолі, як добре, щоб побачити, чи знаходиться об'єкт десь у куполі без будь-яких клікерів ..
blamb

@TJCrowder Ці приклади, здається, більше не доступні.
Стефан ван ден Аккер

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

48

Тут багато напівправди, тому я подумав, що я роблю деякі речі зрозумілішими.

Насправді ви не можете точно сказати, чи існує змінна (якщо ви не хочете загортати кожен другий рядок у блок-пробу).

Причина в тому, що 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це добре для перевірки, чи існує. Ви виймаєте це з контексту. (Я також згадав, що це сиденот, не суворо пов'язаний з темою питання про ОП)
gblazex

2
Ви знову плутаєте термін, не визначений із типом undefined. Вони не однакові. (note) it can be used !== you should use. Використовуйте здоровий глузд під час читання. Коли оголошена змінна (список параметрів або в іншому місці), і ви хочете перевірити, чи отримано це значення, !=null повністю безпечний. Це інший випадок, ніж те, про що просив ОП, тому я натрапив на це як замітку. Весь абзац про пост @ Кевіна і тип примусу btw. Як можна помітити, якщо ви уважно читаєте.
gblazex

@JAL Ви пропускаєте частину, у якій не ризикуєте помилитися, != nullколи знаєте, що змінна оголошена. Це дуже корисно для перевірки аргументів функції, врахуйте:var hasValue = function(foo) {return foo != null}
tybro0103

@ tybro0103 це правда, але вся проблема "Як я можу перевірити існування об'єкта в JavaScript?". Якщо ви впевнені, що це було оголошено, це вже інша ситуація.
JAL


8

Два способи.

typeof для локальних змінних

Ви можете протестувати локальний об'єкт за допомогою typeof:

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

вікно глобальних змінних

Ви можете перевірити глобальний об'єкт (той, який визначений у глобальній області), перевіривши об’єкт вікна:

if (window.FormData) {}


5

Ви можете використовувати "typeof".

if(typeof maybeObject != "undefined")
    alert("GOT HERE");

4

Нитка була відкрита досить давно. Я думаю, що тим часом використання термінального оператора є найпростішим варіантом:

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

Так, щось у порядку var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;і перевірити, чи ні false.
Hmerman6006

3

Раніше я робив if(maybeObject)нульову перевірку в своїх Java-скриптах.

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

Тож лише якщо maybeObject- це об'єкт, буде показано попередження. Я маю приклад на своєму сайті.

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


Проблема полягає в тому, якщо можливоObject не був оголошений, це призведе до помилки: можливоObject не визначено
Juanma Menendez

якщо 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 не існувало.

Я сподіваюся, що це допомагає. (BTW, я початківець з 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

Або ви можете почати використовувати мій ексклюзивний метод існує () замість цього і мати можливість робити речі, які вважаються неможливими. тобто:

Такі речі, як: exists("blabla")або навіть: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")також можливі ...


4
І де цей метод?
v010dya
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.