Під час першого знайомства з JavaScript часто роблють невеликі демонстраційні проекти, а потім постійно вдосконалюють їх, додаючи різні функціональності. Одного разу, коли я розробляв інтерфейс, мені знадобилася перевірка типів, і в самий момент, коли все здавалося нормальним, раптом я виявив, що звичайний метод typeof розпізнає пусте значення як об’єкт?! Тому я вирішив ретельніше зрозуміти це питання і виявив, що перевірка типів, здавалося б, проста, насправді має багато тонкощів.
Оператор typeof
Метод typeof, без сумніву, це те, що я називаю “світлом серед ночі” – перша річ, яка приходить на думку, коли виникає необхідність в перевірці типу в JavaScript. Ми можемо використовувати оператор typeof для визначення типу значення. Оператор typeof повертає рядок, що вказує на тип операнду. Він може точно визначати тип більшості примітивних типів даних, але має деякі особливості щодо об’єктів і null.
console.log(typeof null);
console.log(typeof []);
console.log(typeof function fn() {});
Очевидно, що цей метод не дуже добре підходить для перевірки типів значень масивів та null. Але чому ж null визначається як об’єкт? Насправді, це є одна з помилок, яку зробили в процесі проектування мови JavaScript. Фактично, метод typeof перетворює дані на двійкове значення і, відповідно до перших трьох бітів, визначає тип. Перші три біти об’єктів завжди дорівнюють 0, і випадково, значення null в двійковому форматі також складається з 0, тому typeof визначає null як об’єкт. Це свого роду обман. Тому нам потрібні більш високорівневі методи.
Оператор instanceof
Порівняно з typeof, оператор instanceof є більш високорівневим. Він використовується для перевірки того, чи присутнє властивість prototype конструктора в ланцюжку прототипів певного екземпляру об’єкта. Зазвичай він використовується для визначення того, чи об’єкт є екземпляром певного класу. Це як не просто перевірка вашої особи, але й перевірка вашої родини. Ось простий приклад:
function Person() {}
const person = new Person();
console.log(person instanceof Person); // true
Порівняно з typeof, instanceof, здається, набагато надійніший і визначає типи, які не є вбудованими у JavaScript, проте, на жаль, він все ще визначає масиви як об’єкти і повертає логічне значення, тобто він не може просто сказати вам, який це тип, а тільки чи це так.
Сказавши про це, не можна не почати дратуватися: чи насправді у мові JavaScript немає методу, який би точно визначав тип? Звичайно, ні.
Object.prototype.toString.call()
Може ідеально визначити тип. В JavaScript кожен об’єкт має внутрішній атрибут Class, який використовується для ідентифікації типу об’єкта. Це значення – це рядок, який вказує на конкретний тип об’єкта.
Метод Object.prototype.toString перевизначено так, що при його виклику повертається рядок, що містить значення Class. Таким чином, можна визначити тип об’єкта за отриманим рядком. Наприклад, для числового типу значення 42, його значення Class буде Number, тому Object.prototype.toString.call(42) поверне рядок [object Number].
Так само, для рядків, логічних значень, undefined та null їх значення Class відповідно будуть String, Boolean, Undefined та Null. Щодо об’єктів та масивів, їх значення Class буде Object та Array відповідно.
Отже, за допомогою методу Object.prototype.toString.call() можна точно визначити тип об’єкта та масиву. Підсумок Сподіваємося, що цей огляд допоможе вам краще зрозуміти різні методи перевірки типів у JavaScript, що може бути корисним для вас. У реальному виробництві вибір правильного методу перевірки типів дуже важливий залежно від конкретних вимог. На завершення бажаємо вам 0 попереджень і 0 помилок!
Залишити відповідь