Ответ 1
Нет.
instanceof
также проверяет "наследуемые" конструкторы.
Является ли a instanceof b
в точности эквивалентным a.constructor === b
? Если нет, то какая разница между ними?
Нет.
instanceof
также проверяет "наследуемые" конструкторы.
Ответ 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
, если вы хотите проверить, является ли тип переменной примитивным типом, а не объектом.