Ну, я не могу проследить за партией с length
, являющейся 0
, вы действительно запустили цикл? Это должно работать просто отлично.
Но в отношении оператора typeof
этот оператор (вместе с оператором instanceof), вероятно, является самой большой ошибкой в дизайне JavaScript. Это близко к тому, чтобы быть полностью сломанным .
Хотя instanceof
все еще имеет ограниченное использование, typeof
действительно имеет только один
Практический вариант использования, в котором не происходит проверки типа объекта.
JavaScript Typetable
Value Class Type
-------------------------------------
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object (function in Nitro/V8)
new RegExp("meow") RegExp object (function in Nitro/V8)
{} Object object
new Object() Object object
В приведенной выше таблице Тип относится к значению, которое возвращает оператор typeof
. Как
Вы можете видеть, что это совсем не так.
Класс относится к значению внутреннего свойства [[Class]]
объекта.
Из спецификации: Класс может принимать одно из следующих значений:
"Arguments"
, "Array"
, "Boolean"
, "Date"
, "Error"
, "Function"
,
"JSON"
, "Math"
, "Number"
, "Object"
, "RegExp"
, "String"
Чтобы получить значение Класс , можно использовать
toString
метод Object
.
Проверка класса объекта
function is(type, obj) {
return Object.prototype.toString.call(obj).slice(8, -1) === type;
}
is('String', 'test'); // true
is('String', new String('test')); // true
В приведенном выше коде Object.prototype.toString
вызывается с
this
устанавливается на объект, который его
Класс значение должно быть получено.
Проверка, была ли определена переменная
typeof foo !== 'undefined'
Выше будет проверено, был ли foo
фактически объявлен или нет, так как просто
ссылка на него приведет к ReferenceError
. Это единственное
typeof
на самом деле полезно для.
Подводя итог
Не используйте typeof
, если вы не проверяете наличие переменной.