Я работаю с node.js, поэтому это может быть специфично для V8.
Я всегда замечал некоторые странности с различиями между typeof и instanceof, но вот тот, который действительно меня беспокоит:
var foo = 'foo';
console.log(typeof foo);
Output: "string"
console.log(foo instanceof String);
Output: false
Что там происходит?
typeof
- это конструкция, которая "возвращает" примитивный тип того, что вы его передаете. instanceof
проверяет, отображается ли правый операнд в цепочке прототипов слева.
Важно отметить, что существует огромное различие между строковым литералом "abc"
и строковым объектом new String("abc")
. В последнем случае typeof
вернет "объект" вместо "string".
Будут буквальные строки и существует класс String
. Они являются отдельными, но они работают без проблем, т.е. Вы все равно можете применять методы String
к литеральной строке и будут действовать так, как если бы буквальная строка была экземпляром объекта String
.
Если вы явно создаете экземпляр String
, это объект, и это экземпляр класса String
:
var s = new String("asdf");
console.log(typeof s);
console.log(s instanceof String);
Вывод:
object
true
typeof
фактически будет "object"
(строчная строка)
String
типа. Большую часть времени они взаимозаменяемы, по-видимому, не с целью проверкиinstanceof
.