Альтернатива безлічі 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
оператора, цей метод не перевіряє прототип ланцюга об'єкта.
foo
оголошено,typeof foo === 'undefined'
абоtypeof foo === typeof undefined