Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用javascript';“始终返回”的类型;对象";?_Javascript_Typeof - Fatal编程技术网

为什么使用javascript';“始终返回”的类型;对象";?

为什么使用javascript';“始终返回”的类型;对象";?,javascript,typeof,Javascript,Typeof,如果它总是返回对象作为类型,那么它的用途是什么 始终用于元素或列表 它并不总是返回“object”: 也就是说,检查对象的一个(可能)更有用的技巧是使用Object.prototype.toString.call()并查看结果: var t = Object.prototype.toString.call(itIsAMystery); 这将为您提供一个类似[objectfoo]的字符串,其中“Foo”是构造函数(我认为)是有趣的部分。对于“原生”类型(如日期或字符串),您可以返回构造函数名称。

如果它总是返回
对象
作为类型,那么它的用途是什么

始终用于元素列表

它并不总是返回“object”:

也就是说,检查对象的一个(可能)更有用的技巧是使用
Object.prototype.toString.call()
并查看结果:

var t = Object.prototype.toString.call(itIsAMystery);

这将为您提供一个类似
[objectfoo]
的字符串,其中“Foo”是构造函数(我认为)是有趣的部分。对于“原生”类型(如日期或字符串),您可以返回构造函数名称。

js的类型并不总是返回“object”,但它返回对象的对象,人们可能不认为这些对象是IE数组,而且奇怪的是,空值。

对于数组,这是正确的,因为就JS而言,数组是对象;它们是一样的。Array只是另一个类,您可以实例化Array类型的对象,但它们仍然被视为对象


在JS中有一个类型列表,以及您将从typeof获得的每个类型的响应。它还有一些JS代码,可以用返回更多有用信息的函数覆盖typeof函数。如果您担心它没有用,如果您愿意,可以实现类似的功能。

您必须了解JavaScript中的类型系统是动态的,有一些“primative”类型可供构建。通过将所有复杂对象视为类型“object”,这允许您避开类型并调用方法,而不必知道所传递对象的类型(假设该类型实现了函数调用)。在动态编程语言中,一切都是一个“对象”。

根据我的经验,typeof的主要问题在于区分数组、对象和空值(都返回“对象”)

为此,我首先检查typeof,然后检查null大小写或“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;
        }
    }
}

操作员的类型需要稍微小心一点。它返回“object”表示空值,返回“number”表示NaN,返回“number”表示无穷大,返回“object”表示“new number(1)”,返回“object”表示数组

在检查变量(typeof variable!==“undefined”)是否存在时,有时需要首先检查(variable==null),因为typeof为分配给null的变量返回“object”


这有点明显,但在检查typeof时也必须小心不要调用函数,因为函数的返回类型将被报告,而不是“函数”

若要与其他插件一起使用,typeof将同时返回对象和原语。javascript中有5种基本类型:未定义、null、boolean、string和number。其他一切都是一个对象。当typeof应用于函数以外的任何对象类型时,它只返回“object”。当应用于函数时,它返回一个函数对象

例如:

  • 正确的类型//返回基本类型“boolean”
  • 123型//返回原语类型“number”
  • typeof null//返回“object”,这是一个错误,但到目前为止,在另一个ECMAScript版本中还没有修复程序,只需讨论一下这样做
  • typeof object//返回“object”,这很有意义
为了进一步阐明Pointy的答案,在ECMAScript 5中,每个JavaScript对象中都有一个称为[[Class]]的内部属性。为了显示对象的实际值,可以使用:
object.prototype.toString
引用[[Class]]属性。为了避免一些专门的内置对象覆盖toString,您可以使用内部调用方法来显示实际的对象类型

因此,不要从toString获取泛型对象:

var dateObject = Object.prototype.toString(new Date);
document.write(dateObject);//[object Object]
您可以使用调用获取实际的对象类型:

var dateObject = Object.prototype.toString.call(new Date);
document.write(dateObject);//[object Date]

并非所有typeof都返回对象

对象、数组正则表达式返回一种类型的
对象

函数是一个对象(引用类型),但返回
函数的类型
。这是语言上的矛盾

另外需要注意的是,undefined返回
undefined
,而null返回
object
,这是JS中的一个bug

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)

它很有用,因为它不这样做。一些客户端为从“getElementsByTagName”等方法返回的节点列表返回typeof='function'。我提到它是因为最近在windows上使用Safari时它咬了我一口字符串&
console.log(字符串类型(“foo”);//字符串
console.log(新字符串的类型(“foo”);//对象
注意
新建
相关帖子的使用。。。“福”是。。。
[[Class]]
内部属性的值,对于本机对象,它表示规范定义的分类,而不是真正的类型!-对于主机对象,它基本上可以是任何东西……请注意,
typeof
操作符总是为函数的
这个
范围返回
对象
(除非该范围恰好是函数)。请参阅Duck类型语言不要总是忽略类型-例如,Python是Duck类型的,并且有一个有用的type()告诉您对象的类型。您可以将任何类型传递到任何位置,但这并不意味着除了object之外没有其他类型。这对我的情况很有帮助,因为我有数字、字符串、null,以及我迭代的对象。我能够将对象从空值中分离出来进行转换。Link is dead:/Nice您已经包含了ECMA 2015(也称为ECMA 6)中引入的
符号
数据类型
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)