嗯,我不能按照length 是0 的部分,你真的运行循环吗?它应该可以正常工作。
但是关于typeof 操作符,那个操作符(连同instanceof 操作符)可能是JavaScript 最大的设计缺陷。它即将被完全损坏。
虽然instanceof仍有其有限的用途,但typeof确实只有一个
实际用例,不会发生检查对象的类型。
JavaScript 类型表
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]]属性的值。
来自规范: Class 可以是以下值之一:
"Arguments", "Array", "Boolean", "Date", "Error", "Function",
"JSON"、"Math"、"Number"、"Object"、"RegExp"、"String"
为了检索 Class 的值,必须使用
toStringObject的方法。
检查对象的类
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,除非您正在检查变量是否存在。