Ответ 1
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 и String. Кроме того, существует объект Object для объектов, обладающих свойствами.
Например, функции имеют тип 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;
}
}
Для примитивов он вернет свой тип в нижнем регистре, для объектов он вернет класс в заголовке.
<сильные > Примеры:
-
Для примитивов типа Номер (например,
5
) он вернет'number'
для объектов-оболочек класса Номер (например,new Number(5)
), он вернет'number'
; -
Для функций он вернет
'Function'
.
Если вы не хотите различать примитивные значения и объекты-обертки (по какой-либо, вероятно, плохой причине), используйте typeOf(...).toLowerCase()
.
Известные ошибки - это некоторые встроенные функции в IE, которые считаются 'Object'
и возвращаемое значение 'unknown'
при использовании с некоторыми объектами COM +.