instanceof
не должен возвращать false все время в вашем примере , если вы не тестируете объекты из другого окна, потому что массив из одного окна не экземпляр Array
конструктора другого окна.
Использование instanceof
замечательно, когда вам нужно проверить какую-то конкретную вещь, и вы работаете в одном окне (вы должны знать о строковом примитиве и объекте String, о котором говорил Скунлифф). Обратите внимание, что вы должны быть осторожны с вашим порядком, так как массив является instanceof
Object
(а также Array
); это относится и к String
s, и ко всем другим объектам.
Существует альтернатива, в которой нет проблемы с окном, и которую можно легко использовать для операторов switch
и т. П., Если вы выполняете диспетчеризацию:
function classify(arg) {
return Object.prototype.toString.call(arg);
}
Это выглядит странно, но для этого используется функция toString
на прототипе Object
, которая имеет определенное поведение (вместо использования любого переопределения, которое может иметь реальный объект, который вы тестируете, который может иметь другое поведение). Итак, учитывая эту функцию:
function show(arg) {
alert(classify(arg));
}
вы получите эти результаты:
show({}); // [object Object]
show("a"); // [object String]
show(new String("a")); // [object String]
show([]); // [object Array]
show(/n/); // [object RegExp]
show(function() { }); // [object Function]
и вы получите эти результаты независимо от того, из какого окна поступает объект, который вы тестируете, и независимо от того, используете ли вы строковый примитив или экземпляр String
.