Одной из основных проблем typeof является то, что он не будет возвращать «string», «boolean», «number», если вы создадите эти объекты с помощью их конструкторов. Посмотрите на этот пример тестирования на строки
typeof "my-string" // "string"
typeof String('my-string') // 'string'
typeof new String("my-string") // "object".
Следовательно, при проверке, является ли аргумент или переменная строкой, логическим числом, числом, необходимо использовать Object.prototype.toString, который возвращает согласованные результаты
function isString(obj) {
return Object.prototype.toString.call(obj) == "[object String]";
}