Javascript - javascript перевіряє, чи існує змінна (визначена

Оператор typeof перевіряє, чи дійсно змінна не визначена.

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

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

@StevenPenny Зараз. Почалося все зовсім по-іншому, тоді OP відредагував його, поки він майже не змінився. - ZAD-Man 19 травня '17 в 10:12

Це досить безглуздо, але. - TrojanByAccident 19 травня '17 в 10:12

@SamuelLiew Вони можуть, але перше насправді вірно (і правомірно) і не має відношення до питання про === проти ==. - Alnitak 19 травня '17 в 10:12

If (! Variable_here) ; Не може визначити, чи є змінна помилкової або невизначеною. - boh 19 травня '17 в 10:12

StackOverflow - це правильні відповіді, а не значки. Крім того, ніхто не повинен ever називати змінну undefined. Я не можу повірити, що це працює. - Cory Danielson 19 травня '17 в 10:12

if (! variable_here) буде перериватися в багатьох випадках. Якщо змінна дорівнює 0 або false, вона не буде виконана. Це не те, чого ви хочете. - Cory Danielson 19 травня '17 в 10:12

Не може вирішити, проголосувати це. Строго кажучи, typeof foo === "undefined" правильно, і краще, ніж верхній проголосований відповідь, але додаткові примітки тільки роблять цей відповідь сбивающим з пантелику. - Alnitak 19 травня '17 в 10:12

@Saiid undefined можна перевизначити. Наприклад: undefined = false; undefined = true ;. Відповідь - єдиний вірний спосіб переконатися, що змінна дійсно не визначена. - Samuel Liew 19 травня '17 в 10:12

@SamuelLiew Імхо ви б краще просто видалили обидві ноти. Яке значення має порівняння зі змінною, що містить "undefined". Використання === замість == - дійсно хороша практика, але ваше обгрунтування чому не має сенсу. - Alnitak 19 травня '17 в 10:12

variable === undefined працює відмінно - TrojanByAccident 19 травня '17 в 10:12

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

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

Інші перевірки також невірні, вони просто використовують різні способи:

if (elem). може використовуватися, якщо elem гарантовано є об'єктом, або якщо false. 0 і т. Д Вважаються значеннями за замовчуванням (отже, еквівалентні undefined або null).

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

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

Також корисно строго порівнювати з undefined.

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

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

відповідь дан David Tang 19 травня '17 в 10:12

Через цю переобумовленої проблеми ви ЗАВЖДИ повинні використовувати void (0) замість undefined. - Barth Zalewski 19 травня '17 в 10:12

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

Це повинен бути прийнятий відповідь. Порівняння з undefined і з використанням typeof в більшості випадків або зовсім не потрібно, або робиться неправильно. Програмування - про надійність, легко читається, простому в обслуговуванні. Чи не про фантазії. - jose.angel.jimenez 19 травня '17 в 10:12

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

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

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

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

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

Ви можете подумати про те, щоб зробити щось на зразок цього:

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

Непідготовлені ReferenceError: foo не визначений

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

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

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

Альтернативою безлічі відповідей typeof є використання hasOwnProperty (). який, звичайно, перевіряє, чи має об'єкт (майже всі в JS) властивість ie змінну (серед Інші речі).

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

Кожен об'єкт походить від об'єкта Успадковує метод hasOwnProperty (). Цей метод може бути використаний для визначення того, чи має об'єкт вказане властивість як пряме властивість цього об'єкта; На відміну від оператора в. цей метод робить Не перевіряйте ланцюжок прототипів об'єкта.

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

Хоча не завжди рішення perfect або ideal. при певних обставинах це просто робота!

Відмінне поліпшення, просте швидке, щоб зрозуміти, спасибі! - CPHPython 19 травня '17 о 10:13

@CPHPython За редакцією; Добре? - Fred Gandt 19 травня '17 о 10:13

Задоволення працювати з вами ;-) - Fred Gandt 19 травня '17 о 10:13

Це приголомшлива альтернатива і повинна бути на вершині upvoted цього питання. Будь ласка, спростите заголовок відповіді робочим прикладом, який повертає true (наприклад, window.hasOwnProperty ( 'console') або var hop = "p"; window.hasOwnProperty ( 'hop')). - CPHPython 19 травня '17 о 10:13

Немає необхідності визначати функцію для пояснення, люди відразу її зрозуміють, а короткий відповідь швидше прочитати. Якщо ви все ще хочете залишити фрагмент, просто залиште на ньому два рядки, перший визначає var і друга - друк результату. - CPHPython 19 травня '17 о 10:13

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

відповідь дан Jith 19 травня '17 в 10:12

Було б корисно показати вбудований висновок кожного попередження. - demisx 19 травня '17 в 10:12

@demisx Погоджено, але замість того, щоб пропонувати редагування, чому б просто не зробити це? Опція існує з якоїсь причини. Деякі можуть вважати це грубим; Я вважаю це ефективним - так відредагував відповідь сам (що очікує розгляду). - Fred Gandt 19 травня '17 в 10:12