本文主要是对js类型用法的详细总结。有需要的朋友可以过来参考一下。希望对你有帮助。
JavaScript中的Typeof其实很复杂。它可以用来做很多事情,但同时也有很多怪异的表现。本文列举了它的多种用途,并指出了存在的问题和解决方法。
https://developer . Mozilla . org/en-US/docs/Web/JavaScript/Reference/Operators/type of?redirect locale=en-USredirectslug=JavaScript/Reference/Operators/type of
type of undefined undefined type of null//已知错误 object type of true boolean type of 123 number type of ABC string type of function(){ } function type of { } object type of[] object type of未知变量 undefined
1.检查一个变量是否存在,是否有值.
typeof将在两种情况下返回“undefined”:变量未声明时,以及变量的值未定义时。例如:type of undeclaredVariable=== undefined true var declared variable;已声明变量的类型“未定义”未定义的类型“未定义”还有其他方法来检测值是否未定义:
var值=未定义;Value===undefined true但是如果该方法用于未声明的变量,它将引发异常,因为通常只有typeof可以检测未声明的变量而不报告错误:
未声明的变量===未定义的引用错误:未声明的变量是未定义的注意:未初始化的变量、未传入的参数、不存在的属性不会有上述问题,因为它们总是可访问的,它们的值总是未定义的:
var已声明变量;声明变量===undefined true(function(x){ return x==undefined }())true({ })。foo==undefined true译者注:因此,如果要检测可能未声明的全局变量的存在,也可以使用if(window . maybe undefined variable){
问题:完成这样的任务,typeof是非常复杂的。
解决方法:这种操作不是很常见,所以有人觉得没必要找更好的解决方法。然而,也许有人会提出一个特殊的运算符:
已定义的未声明变量false var declaredVariableDefined declaredVariable false或者,可能有人需要一个检测变量是否声明的运算符:
已声明的undeclaredVariable false var declared variable;declaredVariable true译者注:在perl中,上面定义的运算符等价于defined(),上面声明的运算符等价于exists()。
2.判断一个值不等于undefined也不等于null
问题:如果你想检查一个值是否已经定义(该值不是未定义的或者null),那么你就遇到了typeof最著名的怪异表现之一(被认为是一个bug):typeof null返回 object :Typeof null object 译者注:这只能说是最初JavaScript实现中的bug,但现在标准就是这么标准化的。V8已经修改并实现了typeof null===null ,但最终被证明不可行。 http://wiki . ecmascript . org/doku . PHP?id=harmony:typeof_null
解决方案:不要对此任务使用typeof,而是使用以下函数:
函数被定义(x) { return x!==null x!==未定义;}另一种可能是引入“defaultValue操作符”。如果myValue未定义,以下表达式将返回默认值:
myValue?上述表达式相当于:
(myValue!==未定义的myValue!==null)?MyValue:默认值或:
myValue?=defaultValue实际上是以下语句的简化:
myValue=myValue?默认当您访问嵌套属性(如bar)时,您可能需要此运算符的帮助:
Obj.foo.bar如果Obj或Obj.foo未定义,上面的表达式会抛出异常。一个接线员。当逐层遍历时,可以使上面的表达式返回第一个具有未定义值或空值的属性:
obj。福。bar的上述表达式相当于:
(obj===未定义|| obj===null)?obj:(obj . foo===undefined | | obj . foo===null)?obj.foo
3.区分对象值和原始值
以下函数用于检测x是否为对象值:function is object(x){ return(type of x=== function | |(type of x=== object x!==null));}问题:上面的检测比较复杂,因为typeof将函数和对象视为不同的类型,typeof null返回‘object’。
解决方案:以下方法也经常用于检测对象值:
function is Object 2(x){ return x===Object(x);}警告:你可能认为这里可以用instanceof Object来检测,但是instanceof是通过使用一个使用对象的原型来判断实例关系的。那么没有原型的物体呢:
var obj=object . create(null);object . getprototypeof(obj)null obj确实是一个对象,但它不是任何值的实例:
在实践中,你可能很少遇到这样的对象,但它确实存在,并有其用途。
译者注:Object.prototype是默认存在的对象,没有原型。
Object . getprototypeof(Object . prototype)null type of Object . prototype“Object”Object . prototype instance of Object false
4.原始值的类型是什么?
typeof是检查原始值类型的最佳方式。Type ABC string 未定义的type undefined 问题:你必须知道typeof null的怪异表达式。
Typeof null //小心!Object 解决方案:下面的函数可以解决这个问题(仅针对这个用例)。
函数getPrimitiveTypeName(x){ var typeName=type of x;switch(typeName){ case undefined :case boolean :case number :case string :返回typeName;case“object”:if(x===null){ return“null”;} default: //之前通过的判断都没有抛出new TypeError (parameter不是初始值: x );} }
更好的解决方案:实现一个函数getTypeName(),该函数除了可以返回原始值的类型之外,还可以返回对象值的内部[[Class]]属性。下面是这个功能的实现方法(译者注:$。jQuery中的类型就是这样一种实现)
5.某个值是否是函数
typeof可用于检查值是否为函数。type of function(){ }“function”type of对象。prototype.tostring 函数原则上,instanceof函数也可以用来检查这个需求。乍一看,好像文笔比较飘逸。然而,浏览器有一个怪癖:每个框架和窗口都有自己的全局变量。因此,如果将对象从一个帧转移到另一个帧,instanceof将无法正常工作。因为这两个框架有不同的构造函数。这就是ECMAScript5中有Array.isArray()方法的原因。如果有一种跨框架的方法来检查一个对象是否是给定构造函数的实例,那就太好了。上面的getTypeName()是一个可用的变通方法,但是可能还有一个更基本的解决方案。
6.综述
下面提到的,应该是目前JavaScript中最迫切需要的,可以替代typeof目前职责的部分功能特性:IsDefined()(比如Object.isDefined()):可以作为函数或者运算符isObject() getTypeName()可以跨框架使用,检测对象是否为指定构造函数实例的机制会检查是否声明了变量,所以可能不需要有自己的运算符。