Является ли a instanceof b
в точности эквивалентным a.constructor === b
? Если нет, то какая разница между ними?
Разница между instanceof и свойством constructor
Ответ 1
Нет.
instanceof
также проверяет "наследуемые" конструкторы.
Ответ 2
Ответ SLaks правильный, но я хотел бы добавить, что .constructor
работает на примитивных типах, а instanceof
нет:
"Hello World".constructor == String; //true
"Hello World" instanceof String; //false
Причина, по которой второе условие ложно, заключается в том, что "Hello World"
является примитивной строкой, а не объектом, поэтому она не является экземпляром чего-либо. В первом условии, с другой стороны, при применении метода (такого как constructor
) к примитивному типу, он преобразуется в объект. Итак, сначала "Hello World"
преобразуется в new String("Hello World")
, а затем возвращает new String("Hello World").constructor
, который является String
. Это работает одинаково для чисел и логических значений.
Вы также можете использовать typeof
для примитивных типов, но это не будет работать на объектах:
typeof "Hello World"; //"string"
typeof new String("Hello World"); //"object"
Итак, если вы имеете дело со строками, числами или логическими значениями и вам не нужно беспокоиться о наследовании, вам следует использовать:
.constructor
, если вы хотите проверить, является ли переменная строкой, числом или логическим значением, и не имеет значения, является ли она примитивным типом или объектом.Есть и другие способы сделать это, например,
typeof foo.valueOf()
или(foo instanceof String || typeof foo == "string")
, но.constructor
- самый короткий. Однако более длинные способы могут быть полезны, если по какой-то причине у вас есть классы, которые наследуютString
,Number
илиBoolean
, и вы также хотите проверить унаследованные типы.instanceof
, если вы хотите проверить, является ли переменная объектомString
,Number
илиBoolean
, а не типом примитива.typeof
, если вы хотите проверить, является ли тип переменной примитивным типом, а не объектом.