Является ли 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, если вы хотите проверить, является ли тип переменной примитивным типом, а не объектом.