为什么使用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”,这很有意义
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)