value instanceof Constructor
совпадает с Constructor.prototype.isPrototypeOf(value)
, и оба проверяют [[Prototype]] - цепочку value
на наличие вхождения конкретного объекта.
Строки и числа являются примитивными значениями , а не объектами и, следовательно, не имеют [[Prototype]], поэтому он будет работать, только если вы оберните их в обычные объекты (называемые «боксом» в Java).
Также, как вы заметили, String(value)
и new String(value)
делают разные вещи: если вы вызываете функции конструктора встроенных типов без использования оператора new
, они пытаются преобразовать ('cast') аргумент для конкретного типа. Если вы используете оператор new
, они создают объект-оболочку.
new String(value)
примерно эквивалентен Object(String(value))
, который ведет себя так же, как new Object(String(value))
.
Еще немного о типах в JavaScript: ECMA-262 определяет следующие типы примитивов: Undefined , Null , Boolean , Number и Строка . Кроме того, есть тип Объект для вещей, которые имеют свойства.
Например, функции имеют тип Object (они просто имеют специальное свойство, называемое [[Call]]), а null
является примитивным значением типа Null . Это означает, что результат оператора typeof
на самом деле не возвращает тип значения ...
Кроме того, объекты JavaScript имеют другое свойство, называемое [[Class]]. Вы можете получить его через Object.prototype.toString.call(value)
(это вернет '[object
Classname
]'
). Массивы и функции имеют тип Object , но их классы: Array и Function .
Тест для класса объекта, приведенный выше, работает, когда instanceof
терпит неудачу (например, когда объекты передаются между границами окна / фрейма и не используют одни и те же прототипы).
Также вы можете попробовать эту улучшенную версию typeof
:
function typeOf(value) {
var type = typeof value;
switch(type) {
case 'object':
return value === null ? 'null' : Object.prototype.toString.call(value).
match(/^\[object (.*)\]$/)[1]
case 'function':
return 'Function';
default:
return type;
}
}
Для примитивов он вернет их тип в нижнем регистре , для объектов он вернет их class в title case .
Примеры:
Для примитивов типа Число (например, 5
), он вернет 'number'
, для объектов-оболочек класса Число (например, new Number(5)
), будет возвращено 'Number'
;
Для функций возвращается 'Function'
.
Если вы не хотите различать примитивные значения и объекты-обертки (по какой-либо, возможно, неправильной причине), используйте typeOf(...).toLowerCase()
.
Известными ошибками являются некоторые встроенные функции в IE, которые рассматриваются как 'Object'
и возвращаемое значение 'unknown'
при использовании с некоторыми объектами COM +.