Разница между instanceof и свойством constructor

Является ли a instanceof b в точности эквивалентным a.constructor === b? Если нет, то какая разница между ними?

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