Як перевірити не визначену змінну в JavaScript


912

Я хотів перевірити, чи вказана змінна чи ні. Наприклад, наступне подає не визначену помилку

alert( x );

Як я можу виявити цю помилку?




1
Це не дублікат маркованого дубліката. Змінна роздільна здатність та роздільна здатність об'єкта - це дуже різні речі. Кращий дублікат - як перевірити, чи існує змінна в JavaScript? .
RobG

Ваша помилка пояснюється тим, що змінна не оголошується. Більшість відповідей орієнтовані на завдання. Дивіться мою відповідь для отримання додаткової інформації. Крім того, багато з них неправильно стверджують, що null та undefined є об’єктами в JavaScript. Це примітиви , а не предмети ...
JBallin

Відповіді:


1689

У JavaScript nullє об'єктом. Там інше значення для речей , які не існують, undefined. DOM повертаєтьсяnull майже для всіх випадків, коли не вдається знайти деяку структуру в документі, але саме в JavaScript undefinedвикористовується значення, яке використовується.

По-друге, ні, прямого еквівалента немає. Якщо ви дійсно хочете перевірити спеціально для цього null, зробіть:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Якщо ви хочете перевірити, чи існує змінна, це можна зробити лише за допомогою try/ catch, оскільки typeofбуде розглядатися незадекларована змінна та змінна, оголошена зі значенням undefinedяк еквівалент.

Але, щоб перевірити, чи вказана змінна та ні undefined:

if (yourvar !== undefined) // Any scope

Раніше потрібно було скористатися typeofоператором, щоб перевірити, чи не визначено безпечно, тому що можна було перепризначити undefinedточно так само, як змінну. Старий спосіб виглядав так:

if (typeof yourvar !== 'undefined') // Any scope

Проблема undefinedповторного присвоєння була виправлена ​​у ECMAScript 5, який був випущений у 2009 році. Тепер ви можете безпечно використовувати ===та !==протестувати undefinedбез використанняtypeof якundefined це було прочитано лише деякий час.

Якщо ви хочете знати, чи існує член незалежного, але все одно, яке його значення:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Якщо ви хочете знати, чи є змінна правдоподібною :

if (yourvar)

Джерело


71
undefined не є застереженим словом; ви (або чийсь інший код) можете зробити "undefined = 3", що порушить два ваші тести.
Jason S

6
"Якщо ви знаєте, що змінна існує, але не знаєте, чи є в ній якесь значення" - так ?!
Джейсон S

36
Я думаю, що він має на увазі змінну, яку не було призначено. наприклад: var foo; // foo існує, але не має значення
Wally Lawless

3
Хммм ... я щойно помітив посилання "джерело": весь цей пост є прямою цитатою зі списку розсилки, і, ймовірно, його слід відредагувати, щоб зробити це більш зрозумілим, оскільки оригіналу автор не доступний для з'ясування.
Jason S

11
"У JavaScript null - це об'єкт.", Це насправді не відповідає дійсності, і, ймовірно, винуватцем цього неправильного уявлення є typeofоператор ( typeof null == 'object'). nullЗначення є примітивним значенням , яке є єдиним значенням типу Null .
CMS

347

Єдиний спосіб по-справжньому перевірити, чи змінна - undefinedце зробити наступне. Пам'ятайте, що невизначений - це об’єкт у JavaScript.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

Деякі з інших рішень у цій темі змусять вас вважати, що змінна не визначена, навіть якщо вона була визначена (наприклад, зі значенням NULL або 0).


18
Тому що питання НЕ НЕ ВИЗНАЧЕНО, тут слід набрати деякийVar! == 'undefined', правда?
eomeroff

1
Дійсно, я не вважаю таким, що невизначений є об'єктом, перевірте документацію спочатку developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus

2
Єдиний тест, який не дає ReferenceError.
Nostalg.io

2
Цей код правильний, але я думаю, що припущення undefined, що об'єкт в JavaScript - це дезінформація. Чи стосується ця заява взагалі до вашої відповіді? Це значення undefinedтипу undefined, присвоєне глобальному ідентифікатору з назвою undefined.
SimplGy

1
Зараз це неправильно, оскільки це єдиний спосіб. undefinedчитається тільки з ES5. Ви можете безпечно перевірити для використання невизначених if (x === undefined) {...}або при допомозі стенографії , як це: if (x === void 0).
Стівен М Ірвінг

66

Технічно правильне рішення (я вважаю):

typeof x === "undefined"

Іноді можна лінуватися і користуватися

x == null

але це дозволяє повернути істину як невизначеній змінній x, так і змінній x, що містить null.


1
якщо ви наберете, var x;тоді typeof x;ви отримаєте так "undefined"само, як і вчинилиtypeof lakjdflkdsjflsj;
Мухаммед Умер

Тож немає способу перевірити наявність невизначеної, але оголошеної змінної?
Мухаммед Умер

1
Я не думаю, що так; Я не впевнений, чому ви цього хочете.
Jason S

ujndefined не повинен бути між
яблуками

що ви маєте на увазі під яблуками?
Джейсон S

19

Ще простішою та скороченою версією буде:

if (!x) {
   //Undefined
}

АБО

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
перший фрагмент коду може бути неправильним, якщо x встановлюється з виклику функції. як x = A (); якщо A не поверне щось, воно повернеться "невизначеним" за замовчуванням. Виконання! X було б правдою, що було б логічно правильним. Однак якщо A () повертає 0, то! X має бути хибним як x = 0. Однак у JS! 0 також вірно.
Раджат

другий код можна скоротити до: if (! typeof (XX)) {...} else {...}
Alejandro Silva

2
@AlejandroSilva Вибачте за пізню відповідь. Це не буде працювати, оскільки typeof повертає рядок, тому він поверне 'undefined' для невизначеної змінної, яка, в свою чергу, буде оцінюватися як TRUE, що призводить до хибного додатного значення var.
Дмитро Фарков

5
Будь ласка, позбудьтесь першого фрагмента, це просто погано
Хуан Мендес

1
Інші коментарі вказували, що перший приклад поганий, але не ясно, чому. Отже, для будь-яких нових кодерів:! X не перевіряє, чи визначено х, але чи правда. Струни, булеві істинні та позитивні числа - це правда (і я можу забути деякі речі), але інші потенційно допустимі значення, такі як 0, булева помилка та порожня рядок, не є правдою. Перший приклад може працювати для конкретних випадків використання (наприклад, тестування рядка, якщо ви можете трактувати порожній такий же, як невизначений), але через безліч, де цього не буде, це не слід вважати способом перевірки за замовчуванням.
cfc

16

Я часто робив:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}

9
Подумайте про зміну "==" на "===". Якщо ви зателефонуєте doSomething (null), ви також отримаєте попередження. Якщо тільки цього не хочеш.
Jason S

Так. Ви повинні вирішити, чи хочете ви рівноцінні або точно рівні. Будь-який випадок може мати користь.
Джо

1
просто перевірте так -> if (typeof змінноїName! == 'undefined') {alert (variaName);}
Muhammad Sadiq

це марно, оскільки ви ніяк не зможете передати невизначений var до функції
avalanche1

2
Звичайно, ти можеш. Спробуйте викликати функцію без аргументу.
Джо

3

Ви також можете використовувати потрійний умовний оператор:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


Що робити, якщо var a = false;? Слід перевірити, якщо a===undefinedзамість цього
Iter Ator

1
Питання: перевірити не визначену змінну ..... Це не визначена змінна: var x; робити вище, викличе помилку
Мухаммед Умер

"Якщо a = false, тоді він покаже" я не знаю 'a "" "- у цьому проблема, питання полягає в тому, щоб перевірити, чи визначено це, а не правда. Якщо a визначено як false, то a не визначено. Це повертає неправильний результат у такому випадку. Дивіться мій коментар на сайті stackoverflow.com/a/858270/2055492 для отримання більш детальної інформації про те, чому такий підхід не працює.
cfc

не тільки буде !aперевіряти істину для undefined, але і перевіряє істину для 0і nullта false. Це дуже неправильно, і його слід видалити.
Стівен М Ірвінг

2

Я часто використовую найпростіший спосіб:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

Редагувати:

Без ініціалізації змінної буде викинуто виняток "Uncaught ReferenceError: змінна не визначена ..."


2
Uncaught ReferenceError: variable is not defined
Мухаммед Умер

@MuhammadUmer, неправильно! variableвизначається через var variable;. І цей фрагмент буде перекривати variableлокальну область. Він може порушити логіку, яка очікує доступу до закритої або глобальної змінної. Тобто:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгеній Савичев

2

Ще одне потенційне «рішення» - використовувати windowоб’єкт. Це дозволяє уникнути проблеми помилки посилань під час роботи в браузері.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

Це взагалі не вирішує оригінальне питання і абсолютно не має значення. Плакат не запитував, як перевірити, чи є щось правдоподібне чи фальсийське, він запитав, як тестувати undefined. Це не зробить.
Стівен М Ірвінг

2

Помилка говорить вам, що xнавіть не існує! Це не було оголошено , що відрізняється від призначення значення.

var x; // declaration
x = 2; // assignment

Якби ви заявили x, ви не отримаєте помилку. Ви отримаєте сповіщення про те, undefinedщо xіснує / було оголошено, але не було призначено значення.

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

if(typeof x  !==  "undefined") {
    alert(x);
}

Це перевірка типу значення, яке зберігається в x. Він повернеться тільки undefinedколи xне було визнано або , якщо він вже був оголошений і ще не був призначений.


undefined читається тільки з ES5 (2009 року випуску), і вам більше не потрібен typeofоператор.
Стівен М Ірвінг

2

У voidповертаєте оператора undefinedдля будь-якого аргументу / вирази , переданого йому. тож ви можете перевірити результат (насправді деякі мініфішери змінюють ваш код з undefinedнаvoid 0 , щоб заощадити пару символів)

Наприклад:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

Дін дінг! Це правильна відповідь. Ганьба це все внизу. Усі настільки затримані, що все ще користуються, typeofі мислення undefinedможе бути перепризначене, що вже неможливо протягом десяти років.
Стівен М Ірвінг

Це було також безпечно перед ES5, тому що тоді навіть якщо ви перепризначені undefined, бо Бог знає лише, з якої причини, використовуючи void 0, завжди повернеться undefinedнезалежно.
Стівен М Ірвінг

1

Ми можемо перевірити undefinedнаступним чином

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

1

Просто зробіть щось подібне нижче:

function isNotDefined(value) {
  return typeof value === "undefined";
}

і називати це так:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

0

Прийнята відповідь правильна. Просто хотів додати ще один варіант. Ви також можете використовувати try ... catchблок для вирішення цієї ситуації. Химерний приклад:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Будьте в курсі catchблоку, який трохи заплутаний, оскільки він створює область на рівні блоку. І, звичайно, приклад надзвичайно спрощений, щоб відповісти на поставлене запитання, він не охоплює кращих практик поводження з помилками;).


0

Я використовую невелику функцію, щоб перевірити, чи була оголошена змінна, яка дійсно скорочує кількість неполадок у моїх файлах javascript. Я додаю перевірку на значення, щоб переконатися, що змінна не тільки існує, але й присвоїла їй значення. Друга умова перевіряє, чи змінна також була ініціалізована, тому що якщо змінна була визначена, але не ініціалізована (див. Приклад нижче), вона все одно видасть помилку, якщо ви спробуєте посилатися на її значення у своєму коді.

Не створений - var my_variable;Миттєвий -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Потім ви можете використовувати умовний оператор, щоб перевірити, що змінна була визначена та створена як ця…

if ( varExists(variable_name) ) { // checks that it DOES exist } 

або перевірити, що це не було визначено та миттєво використане ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
Чому не повернути свій присудок відразу? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.