Чудесный 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.