为什么javascript的typeof总是返回“对象”?

时间:2010-09-24 14:13:37

标签: javascript typeof

如果它总是将“object”作为类型返回,它会用什么?

- 更新

始终用于元素或列表。

7 个答案:

答案 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”。应用于函数时,它返回一个函数对象。

所以,例如:

  • typeof true; //返回基本类型“boolean”
  • 123型; //返回基本类型“number”
  • typeof null //返回“对象”这是一个错误,但到目前为止还没有另一个ECMAScript版本的修复,只是谈论这样做。
  • typeof object //返回“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和调用方法,而不必知道传递的对象的类型,假设该类型具有实现的函数调用。在动态编程语言中,一切都是“对象”。