[JS]js中判断变量类型函数typeof的用法汇总

1、作用:

typeof 运算符返回一个用来表示表达式的数据类型的字符串。

可能的字符串有:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。

2、常用返回值说明

表达式 返回值
typeof undefined ‘undefined‘
typeof null ‘object‘
typeof true ‘boolean‘
typeof 123 ‘number‘
typeof "abc" ‘string‘
typeof function() {} ‘function‘
typeof {} ‘object‘
typeof [] ‘object‘
typeof unknownVariable ‘undefined‘

注意:类型返回值都是字符串、而且都是小写打头

3、常规应用:

1).检查一个变量是否存在,是否有值.

typeof在两种情况下会返回"undefined":一个变量没有被声明的时候,和一个变量的值是undefined的时候.例如:

> typeof undeclaredVariable === "undefined"         true

> var declaredVariable;

> typeof declaredVariable          ‘undefined‘

> typeof undefined                   ‘undefined‘

还有其他办法检测某个值是否是undefined:

> var value = undefined;

> value === undefined             true

但这种方法如果使用在一个未声明的变量上的时候,就会抛出异常,因为只有typeof才可以正常检测未声明的变量的同时还不报错:

> undeclaredVariable === undefined             ReferenceError: undeclaredVariable is not defined

注意:未初始化的变量,没有被传入参数的形参,不存在的属性,都不会出现上面的问题,因为它们总是可访问的,值总是undefined:

> var declaredVariable;

> declaredVariable === undefined                    true

> (function (x) { return x === undefined }())   true

> ({}).foo === undefined                                 true

注:因此,如果想检测一个可能没有被声明的全局变量是否存在,也可以使用 if(window.maybeUndeclaredVariable){}

问题: typeof在完成这样的任务时显得很繁杂.

解决办法: 这样的操作不是很常见,所以有人觉的没必要再找更好的解决办法了.不过也许有人会提出一个专门的操作符:

> defined undeclaredVariable false

> var declaredVariable;

> defined declaredVariable false

或者,也许有人还需要一个检测变量是否被声明的操作符:

> declared undeclaredVariable false

> var declaredVariable;

> declared declaredVariable true

译者注:在perl里,上面的defined操作符相当于defined(),上面的declared操作符相当于exists(),

2.判断一个值不等于undefined也不等于null

问题:如果你想检测一个值是否被定义过(值不是undefined也不是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必须事先声明,否则会报错。

function isDefined(x) { return x !== null && x !== undefined; }

另一个可能性是引入一个“默认值运算符”,在myValue未定义的情况下,下面的表达式会返回defaultValue:

myValue || defaultValue

上面的表达式等价于:

(myValue !== undefined && myValue !== null) ? myValue : defaultValue

其实是下面这条语句的简化:

myValue = myValue || defaultValue

3.区分对象值和原始值

下面的函数用来检测x是否是一个对象值:

function isObject(x) { return (typeof x === "function" || (typeof x === "object" && x !== null)); }

问题: 上面的检测比较复杂,是因为typeof把函数和对象看成是不同的类型,而且typeof null返回"object".

解决办法: 下面的方法也经常用于检测对象值:

function isObject2(x) { return x === Object(x); }

警告:你也许认为这里可以使用instanceof Object来检测,但是instanceof是通过使用使用一个对象的原型来判断实例关系的,那么没有原型的对象怎么办呢:

> var obj = Object.create(null);

> Object.getPrototypeOf(obj)   null

obj确实是一个对象,但它不是任何值的实例:

> typeof obj ‘object‘

> obj instanceof Object false

在实际中,你可能很少遇到这样的对象,但它的确存在,而且有它的用途.

译者注:Object.prototype就是一个默认存在的,没有原型的对象

>Object.getPrototypeOf(Object.prototype)   null

>typeof Object.prototype   ‘object‘

>Object.prototype instanceof Object false

4.原始值的类型是什么?

typeof是最好的用来查看某个原始值的类型的方式.

> typeof "abc" ‘string‘

> typeof undefined ‘undefined‘

问题: 你必须知道typeof null的怪异表现.

> typeof null // 要小心! ‘object‘

解决办法: 下面的函数可以修复这个问题(只针对这个用例).

function getPrimitiveTypeName(x) {

var typeName = typeof x;

switch(typeName) {

case "undefined": case "boolean": case "number": case "string": return typeName;

case "object": if (x === null) { return "null"; }

default: // 前面的判断都没通过 throw new TypeError("参数不是一个原始值: "+x);

} }

更好的解决办法: 实现一个函数getTypeName(),除了可以返回原始值的的类型,还可以返回对象值的内部[[Class]]属性.这里讲了如何实现这个函数(译者注:jQuery中的$.type就是这样的实现)

5.某个值是否是函数

typeof可以用来检测一个值是否是函数.

> typeof function () {} ‘function‘

>  typeof Object.prototype.toString ‘function‘

原则上说,instanceof Function也可以进行这种需求的检测.乍一看,貌似写法还更加优雅.但是,浏览器有一个怪癖:每一个框架和窗口都有它自己的全局变量.因此,如果你将某个框架中的对象传到另一个框架中,instanceof就不能正常工作了,因为这两个框架有着不同的构造函数.这就是为什么ECMAScript5中会有Array.isArray()方法的原因.如果有一个能够跨框架的,用于检查一个对象是否是给定的构造函数的实例的方法的话,那会很好.上述的getTypeName()是一个可用的变通方法,但也许还有一个更根本的解决方案.

6.综述

下面提到的,应该是目前JavaScript中最迫切需要的,可以代替一些typeof目前职责的功能特性:

isDefined() (比如Object.isDefined()): 可以作为一个函数或者一个运算符

isObject()

getTypeName()

能够跨框架的,检测一个对象是否是指定的构造函数的实例的机制

检查某个变量是否已经被声明这样的需求,可能没那么必要有自己的运算符.

时间: 2024-08-27 10:12:50

[JS]js中判断变量类型函数typeof的用法汇总的相关文章

JavaScript中判断变量类型最简洁的实现方法(#################################)

这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了typeof运算符,因此最容易想到的是用typeof来判断是否是number类型. 复制代码代码如下: 1 2 3 function isNumber(obj) {     return typeof obj === 'number' } 这个函数对于整数和浮点数都没有问题,但对于NaN值也返回true这让

jquery ajax中支持哪些返回类型以及js中判断一个类型常用的方法?

1 jquery ajax中支持哪些返回类型在JQuery中,AJAX有三种实现方式:$.ajax() , $.post , $.get(). 预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本.随后服务器端返回的数据会根据这个值解析后,传递给回调 函数.可用值: •"xml": 返回

转战JS(1) 初探与变量类型、运算符、常用函数与转换

转战JS(1)初探与变量类型.运算符.常用函数与转换 做为一名.NET后台开发人员,正考滤向Web前端开发转型,之前也写过一代前端代码,可是当再回头看JS,并有转向它的意愿的时候,突然发现:原来JS不是那么简单的.很多的细节部分以前都没有注意到,现在把学习的知识点记录下来,做为学习笔记,好时不时看看.如果有什么错误,还请各位看官多多包涵.多多指正. JavaScript是一门轻量型的面向Web编程的脚本言语言,常被简称为:JS.广泛应用于PC和各种移动设备中,常和HTML.CSS一起组成网页页面

使用javax.script包实现Java设置JS脚本中的变量

下面例子中,我们通过javax.script包ScriptEngine.put()方法设置JS脚本中的变量,JS把所有在线用户输出. package ajava.code.javase; import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.util.Date; public class AjavaAcc

js 正则之 判断密码类型

原文:js 正则之 判断密码类型 今天没啥写的,就分享个思路吧.之前在群里讨论的时候,谢亮兄弟说判断密码是否是纯数字,纯字母之类的.如果用 if 或者 switch 写看着确实蛋疼,如果有 7, 8 条判断,那就老长一大段了.这个思路是我之前看 jQuery 源码的时候学到的,感觉用在这也不错.先来看代码吧. function test(str, re, msg) { var ret = str.match(re || /^(\d+)$|^([a-zA-Z]+)$|^([a-zA-Z].+)$|

css文件中的样式类被覆盖,js文件中的变量未定义问题问题

Extjs控件中css样式表中的样式类部分被莫名其妙的覆盖 问题原因: 为什么呢? 因为在调用组件W的css样式时,我们自己写了css样式A,Ext组件又自带css样式B,A是我们用cls:'A'放进去.那么这个W到底是用两个样式重复的哪一个种呢? 这就要看css样式表的引入顺序了,如果先引入自己写的,再引入Ext自带的,那么浏览器先读自己写的css样式,然后再读Ext自带的样式.结果我们的自己写的css样式就被覆盖了. 解决办法: 这样就对了. js文件中的变量未定义问题 问题描述: read

(转)JavaScript中判断对象类型的种种方法

我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

以window作为Global目标函数效果域中的变量的函数

匿名函数与闭包运用函数表达式界说函数时,形如varfunctionNam=functionarg0,agr1{}即为匿名函数,由于function关键词后边没有标识符.闭包是指有权拜访另一个函数效果域中的变量的函数.经过在一个函数内创建另一个函数,可以创建闭包.?javascript中,只要办法是有效果域的办法中声明的变量在外部是无法拜访的2.BOMwindow目标表明浏览器的一个实例.既是经过javascript拜访浏览器窗口的一个接口,又是? ECMA Script规则的Global目标.

JavaScript 中对变量和函数声明的提前示例

如题所示,看下面的示例(可以使用Chrome浏览器,然后F12/或者右键,审查元素.调出开发者工具,进入控制台console输入)(使用技巧: 控制台输入时Shift+Enter可以中途代码换行) var name = "xiaoming"; (function(){ var name = name || "小张"; console.info(name); })();// 小张 (function(){ name = name || "小张";