如果它总是将“object”作为类型返回,它会用什么?
- 更新
始终用于元素或列表。
答案 0 :(得分:21)
JS的typeof并不总是返回'object',但它确实返回了人们可能不认为是对象的对象 - 即数组,奇怪的是,返回null。
对于数组这是正确的,因为就JS而言,数组是对象;他们是一回事。 Array只是另一个类,你可以实例化Array类型的对象,但它们仍被视为对象。
This page有一个JS类型列表,以及你从typeof获得的每个类型的响应。它还有一些JS代码来覆盖typeof函数,返回更多有用的信息。如果你担心它没用,你可以根据自己的意愿实现类似的东西。
答案 1 :(得分:6)
它并不总是返回“对象”:
alert(typeof "hello");
也就是说,检查对象的一个(可能)更有用的技巧是使用Object.prototype.toString.call()
并查看结果:
var t = Object.prototype.toString.call(itIsAMystery);
这会给你一个像[object Foo]
这样的字符串,其中“Foo”是构造函数(我认为)这个有趣的部分。对于“本机”类型(如Date或String),您将获得该构造函数名称。
答案 2 :(得分:2)
根据我的经验,typeof的主要问题来自区分数组,对象和空值(都返回“对象”)。
要做到这一点,我首先检查typeof然后检查null case或“object”的构造函数,如下所示:
for (o in obj) {
if (obj.hasOwnProperty(o)) {
switch (typeof obj[o]) {
case "object":
if (obj[o] === null) {
//do somethign with null
} else {
if (obj[o].constructor.name === "Array") {
//do something with an Array
} else {
//do something with an Object
}
}
break;
case "function":
//do something with a function
break;
default:
//do something with strings, booleans, numbers
break;
}
}
}
答案 3 :(得分:1)
需要对typeof运算符稍加小心。它返回null的“object”,NaN的“number”,Infinity的“number”,“new Number(1)”的“object”和数组的“object”。
当检查是否存在变量(typeof variable!==“undefined”)时,有时需要首先检查if(variable == null),因为typeof为赋值为null的变量返回“object”。
这有点明显,但是在检查typeof时也必须小心不要调用函数,因为函数的返回类型将被报告而不是“function”。
答案 4 :(得分:1)
要添加其他内容,typeof将返回对象和基元。 javascript中有5种原始类型:undefined,null,boolean,string和number。所有其他都是一个对象。当typeof应用于除Function之外的任何对象类型时,它只返回“object”。应用于函数时,它返回一个函数对象。
所以,例如:
为了进一步阐述Pointy的答案,每个JavaScript对象中都有一个内部属性,称为ECMAScript 5中的[[Class]]。为了显示对象的实际值,可以引用[[Class]]财产使用:Object.prototype.toString
。为了避免某些专门的内置对象覆盖toString,您可以使用Call的内部方法来显示实际的对象类型。
所以不要从toString中获取通用对象:
var dateObject = Object.prototype.toString(new Date);
document.write(dateObject);//[object Object]
您可以使用Call:
获取实际的对象类型var dateObject = Object.prototype.toString.call(new Date);
document.write(dateObject);//[object Date]
答案 5 :(得分:0)
并非所有typeof都返回对象。
对象,数组和 RegEx 返回类型object
。
函数,它是一个对象(引用类型),但返回的类型为function
。这是语言上的不一致。
要注意的另一件事是, undefined 返回undefined
,而 null 返回object
,这是JS中的错误。
NaN (不是数字)返回类型number
。
更好地跟踪所有这些情况,并注意这些奇怪的行为。
所有类型的值供您参考:
typeof "Tamal" ---> string
typeof 100 ---> number
typeof true ---> boolean
typeof false ---> boolean
typeof undefined ---> undefined
typeof function() {} ---> function
typeof Symbol() ---> symbol
typeof {name: "Tamal"} ---> object
typeof [1, 2, 3] ---> object
typeof /^/ ---> object
typeof NaN ---> number
typeof null ---> object (bug)
答案 6 :(得分:-1)
您必须了解JavaScript中的类型系统是动态的,并且需要构建一些“主要”类型。通过将所有复杂对象视为“对象”类型,这允许您进行duck-type和调用方法,而不必知道传递的对象的类型,假设该类型具有实现的函数调用。在动态编程语言中,一切都是“对象”。