Перевірте JavaScript, чи існує змінна (визначена / ініціалізована)


1762

Який метод перевірки, чи ініціалізована змінна, є кращою / правильною? (Припустимо, що змінна може містити все, що завгодно (рядок, int, об'єкт, функція тощо))

if (elem) { // or !elem

або

if (typeof(elem) !== 'undefined') {

або

if (elem != null) {

5
якщо ви хочете знати, чи fooоголошено, typeof foo === 'undefined'абоtypeof foo === typeof undefined

1
Високооцінені відповіді не працюють для змінних, які оголошуються, але мають значення undefined. Правильна відповідь така: stackoverflow.com/a/36432729/772035
Павло

@Paulpro, використовувана версія hasOwnProperty('bar')не має таких самих недоліків, що й інші, але потребує певного налаштування для Node (замінити windowна global).
олігофрен

@Paulpro Дійсно, але, коли я розмірковував, що перш ніж ти відповів, я дійшов висновку, що це насправді не практична проблема. Коли ви маєте справу зі змінними, що діють до блоку чи функцій, зазвичай це код, яким ви володієте, або маєте доступ до запису, тому ви матимете помилку виконання в будь-якому випадку, що можна виправити. Тоді як звичайна проблема зі змінними, яка не визначена без змін (не існує), зазвичай лежить в коді поза вашим контролем, тому вам потрібен спосіб її виявлення. Отже, це рішення 80/20.
олігофрен

Відповіді:


3051

Ви хочете , щоб на typeofоператора . Конкретно:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
Це виглядає вдалим рішенням, але чи можете ви пояснити, чому це працює?
Морган Чен

46
Власне, ви повинні перевірити, що об’єкт - це те, що вам потрібно. Так що було б, якщо (typeof console == 'object') {// змінна - це те, що мені потрібно, щоб це було}
staticsan

59
@George IV: "просто зробіть` if (змінний) "- гм, ні, це не вдається для false та 0.
Jason S

17
'if (змінний)' також не вдається перевірити наявність властивостей об'єкта.
шотландці

54
@ geowa4 Насправді це призведе до помилки, якщо змінна не визначена.
kevinji

856

typeofОператор буде перевіряти , якщо змінна дійсно НЕ визначена.

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

typeofОператор, в відміну від інших операторів, які не кидає ReferenceError виняток при використанні з неоголошеної змінної.

Однак зауважте, що typeof nullповернеться "object". Ми повинні бути обережними, щоб уникнути помилки ініціалізації змінної в null. Щоб бути безпечним, це те, що ми могли б використати замість цього:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

Для отримання додаткової інформації про використання суворого порівняння ===замість простої рівності ==див.:
Який дорівнює оператору (== vs ===) слід використовувати в порівняннях JavaScript?


2
if (! varia_here) {// ваш код тут. }; не можу сказати, чи змінна помилкова чи невизначена
boh

5
if(! variable_here)порушиться у багатьох випадках. Якщо змінна 0 або false, вона вийде з ладу. Це не те, чого ти хочеш.
Кори Даніельсон

2
не може вирішити, чи голосувати за це. Суворо кажучи, typeof foo === "undefined"це правильна і краща відповідь, яка проголосувала вгорі, але додаткові замітки просто роблять цю відповідь заплутаною.
Альнітак

1
@StevenPenny Перевірте шкалу часу. Верхню відповідь було об'єднано з іншого питання після публікації цієї відповіді
Роб

1
Ця відповідь не працює. Це єдина відповідь, яка працює тут: stackoverflow.com/a/36432729/772035
Павло

222

У багатьох випадках використовуються:

if (elem) { // or !elem

зробимо роботу за вас! ... це перевірить наведені нижче випадки:

  1. undefined : якщо значення не визначене, воно єundefined
  2. null : якщо це null, наприклад, якщо елемент DOM не існує ...
  3. порожній рядок :''
  4. 0 : число нуль
  5. NaN : не число
  6. помилковий

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

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

Крім того, ці перевірки призначені лише для значень , оскільки об'єкти та масиви працюють по-різному в Javascript, порожній масив []і порожній об'єкт {}завжди вірні .

Я створюю зображення нижче, щоб показати короткий короткий відповідь:

undefined, null тощо


2
@Alireza, приємно! Ваша відповідь допоможе багатьом людям там. Я вже запам'ятав ці хибні значення, єдине, в чому я не був впевнений, - це [].
Тіаго Йоїті

13
Я отримую "ReferenceError: elem не визначено"
ropo

3
@ropo, це тому, що ви навіть не визначили елема, щоб перевірити, що це таке, якщо це ваш випадок, вам потрібно перевірити його за допомогою typeof (elem) === "string", про який вже згадувалося ...
Аліреза

19
Тоді відповідь вводить в оману, коли йдеться про if(elem)перевірку на невизначеність (при цьому повертається не визначена помилка), чи не так?
Fanky

1
Надайте мені випадок використання для перевірки, чи змінна не визначена і чи визначено невизначене значення? Деякі з вас схоплюються за соломинку і намагаються виглядати блискуче, але якщо ви встановлюєте значення як невизначене і перевіряєте це значення, очевидно, воно повернеться помилковим або вам потрібно змінити код, smh .... ця відповідь правильна !! !!!
almcaffee

210

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

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

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

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

Це, звичайно, передбачає, що ви працюєте в браузері (де windowназва для глобального об’єкта). Але якщо ви спілкуєтесь з такими глобальними глобалами, напевно, ви перебуваєте в браузері. Суб'єктивно використання 'name' in windowстилістично відповідає використанню window.nameдля позначення глобальних точок. Доступ до глобальних глобальних ресурсів як властивостей, windowа не як змінних дозволяє мінімізувати кількість незадекларованих змінних, на які ви посилаєтесь у своєму коді (для переваги зв’язування), і уникає можливості вашого глобального тіні локальною змінною. Крім того, якщо глобалісти змушують повзати вашу шкіру, вам може бути зручніше торкатися їх лише цією відносно довгою паличкою.


7
Це лише перевіряє, чи змінна була оголошена глобально. Якщо ви правильно кодуєте, то ви обмежуєте ваші глобальні значення. Він повідомить про помилки для локальних vars: (function () {var sdfsfs = 10; console.log ("sdfsfs" у вікні);}) () `
Едді Монж молодший

2
Це найкраща відповідь f $ # ^% ing. Я був на кмітливості з цього приводу, намагаючись розібратися, як пояснити саме цей кутовий випадок. Блискуча. Не мав уявлення, що ти можеш це зробити.
тимчасове_користувач

1
Heads-Up: Ваш відповідь був перенесений сюди з stackoverflow.com/questions/519145 / ...
Shog9

Для Angular користувачів: На жаль, це, мабуть, не дозволено в операторі ng-if.
qwertzguy

... ідеальний план для перевірок за рамками застосування. чи є у вас якісь показники продуктивності, якщо "у вікні" або "(typeof змінної === 'undefined' || змінної === null)". Насправді мене цікавить важкий тест фактів, а не аргументоване потенційне обґрунтування (що я міг би зробити сам: другий пункт має більше операцій -> гірша продуктивність)
Швидше

119

У більшості випадків ви використовуєте:

elem != null

В відміну від простого if (elem), це дозволяє 0, false, NaNі '', але відкидає nullабо undefined, що робить його хорошим, загальний тест на наявність аргументу або властивість об'єкта.


Інші чеки також не є помилковими, вони просто мають різні види використання:

  • if (elem): Може бути використаний , якщо elemгарантовано буде об'єкт, або якщо false, 0і т.д. вважаються значення « по умовчанням» (отже , еквівалентно undefinedабо null).

  • typeof elem == 'undefined'може бути використаний у випадках, коли вказаний nullмає чітке значення для неініціалізованої змінної чи властивості.

    • Це єдина перевірка, яка не видасть помилку, якщо elemвона не оголошена (тобто відсутність varзаяви, не властивість windowабо не аргумент функції). На мою думку, це досить небезпечно, оскільки дозволяє непомітно прослизати друкарські помилки. Щоб цього уникнути, див. Наведений нижче метод.

Також корисне суворе порівняння з undefined:

if (elem === undefined) ...

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

var undefined; // really undefined
if (elem === undefined) ...

Або:

(function (undefined) {
    if (elem === undefined) ...
})();

Вторинна перевага цього методу полягає в тому, що міні-фіксатори JS можуть зменшити undefinedзмінну до одного символу, заощаджуючи кожен раз кілька байт.


17
Я вражений тим, що ти можеш перекрити undefined. Я навіть не думаю, що це варто згадувати у відповіді. Можливо, єдине найгірше прийнятне ім'я змінної у всіх Javascript.
Cori Danielson

2
Це викликає виняток і вимагає використання window.перед змінною, якщо вона використовується в глобальному контексті ... це не найкращий спосіб.
Alex W

4
Через цю найважливішу проблему ВЖЕ ВИНАГИ використовувати void(0)замість цього undefined.
Bartłomiej Zalewski

+1 , так як ця відповідь вказує, що іноді ви можете на самому справі хочете , щоб ідентифікувати false, 0і т.д. , як неприпустимі значення.
rinogo

77

Перевірте, чи window. hasOwnProperty( " varname" )

Альтернатива безлічі typeofвідповідей;

Глобальні змінні, оголошені var varname = value;заявою в глобальній області

можна отримати доступ до властивостей об'єкта вікна.

Як такий, hasOwnProperty()метод, який

повертає булеве значення, що вказує, чи має об'єкт вказану властивість як власну властивість (на відміну від успадкування)

можна використовувати для визначення, чи є

varз «» перем оголошена глобально тобто є власністю window.

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

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

Хоча це і НЕ завжди в досконалий або ідеального рішення, при певних обставинах, це просто робота!

Примітки

Вищезазначене справедливо при використанні varдля визначення змінної , на відміну від letякої:

оголошує локальну змінну області дії блоку, необов'язково ініціалізуючи її до значення.

на відміну від varключового слова, яке визначає змінну глобально, або локально для всієї функції незалежно від області блоку.

На верхньому рівні програм і функцій, letна відміну від цього var, не створюється властивість глобального об'єкта.

Для повноти: const константи, за визначенням, насправді не є змінними (хоча їх вміст може бути); релевантніше:

Глобальні константи не набувають властивостей об’єкта вікна, на відміну від varзмінних. Потрібен ініціалізатор для константи; тобто ви повинні вказати його значення в тому самому виписці, в якому воно оголошено.

Значення константи не може змінюватися за допомогою перепризначення, і її неможливо змінити.

Оголошення const створює посилання на значення лише для читання. Це не означає, що значення, яке він містить, є незмінним, просто те, що ідентифікатор змінної не може бути перепризначений.

Оскільки letзмінні або constконстанти ніколи не є властивостями жодного об'єкта, який успадкував hasOwnProperty()метод, його не можна використовувати для перевірки їх існування.

Щодо наявності та використання hasOwnProperty():

Кожен об'єкт, що походить від Object, успадковує hasOwnProperty()метод. [...] На відміну від inоператора, цей метод не перевіряє прототип ланцюга об'єкта.


1
Це дивовижна альтернатива, і це має бути вгорі кращим у цьому питанні. Будь ласка, спростіть заголовок відповіді робочим прикладом, який повертається true(наприклад, window.hasOwnProperty('console')або var hop = "p";window.hasOwnProperty('hop')).
CPHPython

2
Нарешті щось, що не призводить до помилок через доступ до члена, якого не існує… Щось усі typeofвідповіді просто не помічають.
Зельфір Кальтшталь

1
Ця відповідь застаріла - у стандартному ECMAScript можна визначити змінні, letде ці змінні недоступні як властивості window[або будь-якого іншого доступного] об’єкта. hasOwnPropertyтести на наявність властивостей , а не змінних, і тому не можуть бути використані для виявлення змінних, визначених let.
amn

1
@amn Відповідь залишається вірною щодо використання varта з цього приводу не застаріла. Однак я додав замітку, в якій окреслюється, як використання letта чим constвідрізняється від використання var. Дякую за ваше натхнення; разом ми піднімаємось :)
Фред Гандт

1
@amn Я переписав відповідь (сподіваюсь востаннє), щоб зробити більш зрозумілим, що hasOwnPropertyможна використовувати лише в установленому порядку, щоб перевірити наявність varзмінних. Це добре мені читається.
Фред Гандт

68

Як перевірити, чи існує змінна

Це досить неповторне рішення для тестування, якщо змінна існує та ініціалізована:

var setOrNot = typeof variable !== typeof undefined;

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

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

Проблеми з інкапсуляцією

На жаль, ви не можете просто інкапсулювати чек у функції.

Ви можете подумати про щось подібне:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

Однак це призведе до помилки посилання, якщо ви телефонуєте, наприклад. isset(foo)і змінна fooне була визначена, тому що ви не можете передати функцію неіснуючої змінної:

Uncaught ReferenceError: foo не визначено


Тестування, чи не визначені параметри функції

Хоча нашу issetфункцію не можна використовувати для перевірки існування змінної чи ні (з причин, пояснених далі), вона дозволяє перевірити, чи не визначені параметри функції:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

Незважаючи на те, що жодне значення для yне передається функції test, наша issetфункція прекрасно працює в цьому контексті, оскільки yвона відома у функції testяк undefinedзначення.


41

Існує ще один короткий спосіб перевірити це, коли ви виконуєте прості завдання та відповідні перевірки. Просто використовуйте умовного (термінального) оператора.

var values = typeof variable !== 'undefined' ? variable : '';

Також це стане в нагоді, коли ви намагаєтеся оголосити глобальну змінну з присвоєнням екземпляру посилальної змінної.

Якщо ви хочете перевірити змінну, не повинно бути undefinedабо null. Потім виконайте перевірку нижче.

Коли змінна оголошена, і якщо ви хочете перевірити значення, це навіть просто: і вона буде виконуватись undefinedі nullперевірятися разом.

var values = variable ? variable : '';

відповідь настільки неправильна. Змінна typeof завжди повертає рядок, таким чином, ніколи не є хибною. наприклад , якщо typeof(booooo)є , "undefined"то typeof(typeof boooooo)є "string"і typeof boooooo && trueзавжди true. @ Відповідь John-Slegers приблизно така скорочена, як ви можете отримати з typeof.
mpag

Його абсолютно правильна відповідь . Ось робочий Fiddle . І я не знаю, про який сценарій ви говорите. Питання стосуються перевірки існування змінної.
РаджешКдев

@mpag Не кажіть квартиру неправильно. Доведіть це . Знайти помилку дуже просто, натомість ви можете дати хороші відповіді тут !!!. Якщо відповідь невірна, 28 програмістів не мали б проголосувати без перевірки моєї відповіді. Оскільки тут є багато відомих відповідей, вони могли б проголосувати це, не це.
РаджешКдев

Насправді другий фрагмент коду - це не перевірити те саме, що зазначено вище. Я думав, що люди зрозуміють за цим рядком. If you wanted to check variable shouldn't be undefined or null.Під цим коментарем чітко прописано, що він не повинен перевіряти змінну декларацію. це перевірити змінне значення.
RajeshKdev

1
Ваш другий чек не вдасться зі значенням 0
Fareed Alnamrouti

32

Короткий спосіб перевірки змінної не оголошено (не визначено) є

if (typeof variable === "undefined") {
  ...
}

Я вважаю його корисним для виявлення сценарію, що працює поза браузером (не оголосивши windowзмінну).


це "канонічний шлях", який є портативним?
Джейсон

3
Це неправильно. window.bar=undefinedвизначається і встановлюється значення. Ваша відповідь не може виявити різницю між цим і якщо змінної не існує. Якби ви this.hasOwnProperty('bar')це зробили, можливо, це спрацювало б.
олігофрен

цей код не працює, і ви можете перевірити це за допомогою будь-якої консолі браузера
ha9u63ar

1
Розглянемо const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. Змінна xвизначена, але повертається
помилка

29

Це залежить, якщо вам просто важливо, щоб змінна була визначена або ви хочете, щоб вона мала значуще значення.

Перевіряючи, чи не визначено тип, перевірятиметься, чи вказана змінна ще не визначена.

=== nullабо !== nullперевірять, чи точно вказане значення змінної null.

== nullабо != nullперевірить, чи є значення undefinedчи null.

if(value)перевірятиме , якщо змінна undefined, null, 0або порожній рядок.


12

Найвища відповідь правильна, використовуйте typeof.

Однак те, що я хотів зазначити, це те, що в JavaScript undefinedє змінним (з якоїсь безбожної причини). Тож просто перевірка на varName !== undefinedнаявність потенціалу не завжди повертається так, як ви очікуєте, тому що інші моменти можуть змінитися невизначено. Кілька відповідей (@ skalee's, наприклад), схоже, вважають за краще не використовувати typeof, і це може призвести до неприємностей.

"Старий" спосіб вирішення цього питання був оголошений невизначеним як вар для компенсації будь-якого потенційного приглушення / надмірної їзди undefined. Однак найкращим способом все-таки є використання, typeofоскільки він ігнорує будь-яке переосмислення undefinedіншого коду. Особливо, якщо ви пишете код для використання в дикій природі, де хто знає, що ще може працювати на сторінці ...


1
Справа в суперечливості, тому що якщо varName не визначений, varName !== undefinedце просто спричинить ReferenceError. Змінюваність undefinedне має значення.
Вутаз

Heads-Up: Ваш відповідь був перенесений сюди з stackoverflow.com/questions/519145 / ...
Shog9

1
У нових версіях Javascript undefined- це властивість лише для читання. Однак для куленебезпеки ви можете використовувати typeof mvVar === typeof void 0. void 0повертається undefinedзавжди.
kwarnke

11
if (typeof console != "undefined") {    
   ...
}

Або краще

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

Працює у всіх браузерах


3
Чому останній, на вашу думку, кращий?
skalee

3
@skalee Я згоден останній краще. Це з простої причини, що ви перевіряєте, чи є тими типи, які ви хочете, перш ніж використовувати їх.
Broxzier

Heads-Up: Ваш відповідь був перенесений сюди з stackoverflow.com/questions/519145 / ...
Shog9

9

Якщо я знаю, що змінна повинна бути рядком або об'єктом, який я завжди віддаю перевагу if (!variable), щоб зробити свій внесок у дебати, я перевіряю, чи є його помилковим. Це може привести до більш чистого коду, так що, наприклад:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

..можливо зменшити до:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


Це не те, що запитувала ОП. Якщо data.url дорівнює ''вашому рішенню, він вважатиме його невизначеним, коли він насправді визначається як містить порожній рядок.
Demonblack

Я згоден - це не те, що просили, і ви маєте рацію: порожній рядок '' вважатиметься невизначеним. Але я розмістив це, тому що вважав, що це може бути корисним для дебатів, які були створені серед різних відповідей. І в прикладі, як і в багатьох інших випадках, ви просто хочете надрукувати рядок, якщо є фактично вміст, тож нормально скористатися тим, що JavaScript вважає ложним і порожній рядок, і невизначений
de3

8

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


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
Буде корисно показати вбудований результат кожного попередження.
демікс

@demisx Погодився, але замість того, щоб пропонувати редагування, чому б просто не зробити це? Варіант є з причини. Деякі можуть вважати це грубим; Я вважаю це ефективним - так я відредагував відповідь (до перегляду).
Фред Гандт

1
@Fred - Я переглянув історію редагування і можу здогадатися, чому ваші зміни були відхилені ... а не просто додавати рядки, щоб показати, що буде результатом, як запропонував demisx, ви значно змінили те, що розмістив Jith.
Стівен П

8

Null - значення в JavaScript і typeof nullповертається"object"

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

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

Найбільш надійна перевірка "це визначено" - це typeof

if (typeof elem === 'undefined')

Якщо ви просто перевіряєте, чи визначена змінна призначена за замовчуванням, для легкого читання одного вкладиша ви часто можете це робити:

elem = elem || defaultElem;

Це часто добре використовувати, див. Ідіоматичний спосіб встановити значення за замовчуванням у JavaScript

Існує також цей один вкладиш, який використовує ключове слово typeof :

elem = (typeof elem === 'undefined') ? defaultElem : elem;

7

можна скористатися typeofоператором.

Наприклад,

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

Вище фрагмент коду поверне вихідний результат

Змінна setSet: не визначена.


1
Heads-Up: Ваш відповідь був перенесений сюди з stackoverflow.com/questions/519145 / ...
Shog9

7

Щоб перевірити, чи була оголошена / встановлена ​​змінна, я зробив цей брудний трюк.

Я навіть не знайшов способу витягти код до функції, навіть за допомогою eval.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

Що ви маєте на увазі під "вилученням коду до функції"?
Мелаб

7

Ці відповіді (окрім рішення Фреда Гандта) є або неправильними, або неповними.

Припустимо, мені потрібно, variableName;щоб моє undefinedзначення несло, і тому воно було оголошено таким чином, var variableName;що означає, що воно вже ініціалізовано ; - Як я можу перевірити, чи це вже оголошено?

Або ще краще - як я одразу перевіряю, чи існує "Book1.chapter22.paragraph37" за допомогою одного виклику, але не виникає помилка посилання?

Ми робимо це за допомогою найпотужнішого оператора JasvaScript, оператора in . :

"[variable||property]" in [context||root] 
>> true||false

У часи найвищої популярності AJAX я написав метод (пізніше названий) isNS (), який здатний визначити, чи існує простір імен, включаючи глибокі тести для імен властивостей, таких як "Book1.chapter22.paragraph37" та багато іншого.

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


1
inОператор перевіряє тільки наявність власності, а не всі змінні властивості - constі letдекларація не є (і constне є навіть, ну, змінними ).
amn

1
constі letбули стандартизовані з ECMAScript 2015, який був опублікований більше 3 років тому і з тих пір сприйняв звичне підозрюване, і сьогодні він використовується досить широко, смію сказати - на Github існує більше 2 мільйонів випадків "const" у файлах JS .
amn

Так, "змінна" - точно. Ось чому я прокоментував вашу відповідь, зазначивши, що ви не можете використовувати inоператора для загального тестування того, чи існує змінна , оскільки "const і let не є [властивостями]" - хоча constсправді можна сказати, що вона вводить постійну посилання, як відміну від змінної посилання, letз іншого боку, на самому ділі ввести змінну посилання - це, іншими словами, будь-яка міра, змінної і ваша відповідь невірний в це означає , що ви можете перевірити , є чи змінна визначається letіснує за допомогою inоператора - ви не можете.
amn

Специфікація ECMAScript 6 визначає мову JavaScript, а не ви або веб-браузер. Ось чому його називають специфікацією - вона однозначно вказує мову. Ваша відповідь в кращому випадку застаріла, в гіршому випадку навмисно опускає те, що ви вважаєте неважливим, в той час як це дуже актуально. Цитуючи пов'язану специфікацію, "нехай і const декларації визначають змінні". Ці конструкції недоступні як властивості windowоб'єкта, я не знаю, як зробити це більш зрозумілим для вас.
amn

Відповідь не охоплює всіх випадків змінних. Зокрема, він не охоплює змінні, визначені letключовим словом. Це все, на що я вказував.
атп

6

У конкретній ситуації, окресленій у запитанні,

typeof window.console === "undefined"

тотожне

window.console === undefined

Я віддаю перевагу останній, оскільки він коротший.

Зверніть увагу, що ми шукаємо consoleлише в глобальному масштабі (що є windowоб’єктом у всіх браузерах). У цій конкретній ситуації бажано. Ми не хочемо, щоб consoleце було визначено в іншому місці.

@BrianKelley у своїй чудовій відповіді пояснює технічні деталі. Я лише додав відсутність висновку і переробив його в щось легше для читання.


Heads-Up: Ваш відповідь був перенесений сюди з stackoverflow.com/questions/519145 / ...
Shog9

2
Помилковий. останній кидає виняток у мою консоль.
John ktejik

6

Я використовую два різні способи залежно від об'єкта.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

Іноді я не хочу оцінювати порожній рядок як фальси, тому тоді я використовую цей випадок

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

Якщо вам потрібно навпаки, то в першому випадку змінна! Перетворюється у змінну !!, а в недійсній функції === стають! =, А імена функції змінюються на неінвалідні.


5

Мої уподобання такі typeof(elem) != 'undefined' && elem != null.

Однак ви вирішите скористатися такою функцією, як чек

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

Якщо ви не знаєте, що змінна оголошена, тоді продовжуйте typeof (x) != 'undefined' && x != null;

Там, де ви знаєте, що змінна оголошена, але може не існувати, ви можете використовувати

existy(elem) && doSomething(elem);

Змінна, яку ви перевіряєте, іноді може бути вкладеною властивістю. Ви можете використовувати prop || {} спуститися вниз по лінії, що перевіряє наявність відповідного об'єкту:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

Після кожного використання властивості (... '|| {}'). NextProp так, щоб відсутність властивості не видала помилку.

Або ви можете використовувати існуючий, як existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


Якщо ви поставите його у функцію, це зайве. typeof (x) != 'undefined' && x != nullеквівалентно тому, x != nullколи xоголошено.
Ри-

3

Це залежить від ситуації. Якщо ви перевіряєте, чи не визначено глобально поза кодом (наприклад, jQuery), вам потрібно:

if (typeof(jQuery) != "undefined")

(Тут немає суворої рівності, typeof завжди повертає рядок.) Але якщо у вас є аргументи до функції, яка може бути або не може бути передана, вони завжди будуть визначені, але нульові, якщо вони опущені.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

Спробуйте-ловити

Якщо змінна взагалі не була визначена, ви можете перевірити це без виконання коду розриву, використовуючи блок try-catch наступним чином (вам не потрібно use strictрежим)

БОНУС: (з посиланням на інші відповіді) Чому ===зрозуміліше, ніж ==( джерело )

якщо (a == b)

Введіть тут опис зображення

якщо (a === b)

Введіть тут опис зображення


1
FYI, (a == b), розміщений на сітці Game of Life, не все було таким захоплюючим.
johnsnails

0

Я здивований, що це ще не згадувалося ...

ось кілька додаткових варіантів використання this['var_name']

вигода від використання цього методу в тому, що він може бути використаний до визначення змінної.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

Це неправильно. window.bar=undefinedвизначається і встановлюється значення. Ваша відповідь не може виявити різницю між цим і якщо змінної не існує. Якби ви this.hasOwnProperty('bar')це зробили, можливо, це спрацювало б.
олігофрен

0

Ви можете скористатися блоком спробувати ... catch на зразок наступного:

Недоліком є ​​те, що ви не можете ввести його у функцію, оскільки він би кидав ReferenceError

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

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