Чудесный instanceof
Что не так?
'foo' instanceof String // false
Строка не является экземпляром класса Строка. Чудесно, правда?
Почему так?
Строка 'foo'
создаётся через литерал строки — кавычки (''
). Это не объект, а примитив, а у примитива нет прототипа.
Это относится ко всем примитивам, созданным через литералы — числам, строкам и булям.
true instanceof Boolean // false 42 instanceof Number // false
Но те же числа, строки и були, созданные через конструктор оператором new
— очень дажеявляются экземплярами своих классов, потому как конструктор создаёт не примитив, но объект.
// НИ В КОЕМ СЛУЧАЕ НЕ ПОВТОРЯЙТЕ ЭТОГО ДОМА ИЛИ НА РАБОТЕ // ЭТО МОЖЕТ ПРИВЕСТИ К САМОВОЛОСОВЫРЫВАНИЮ ИЛИ ПОБИТИЮ КОЛЛЕГАМИ let foo = new String('bar'); foo instanceof String // true
Что же делать?
Ну как обычно, страдать. Но если вам всё равно надо узнать тип переменной, проверяйте, не примитив ли это через typeof
.
И только если это не примитив (typeof
выдаст 'object'
), то имеет смысл проверять его прототип через instanceof
.