js中判断变量类型函数typeof的用法总结


Posted in Javascript onAugust 09, 2016

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()
能够跨框架的,检测一个对象是否是指定的构造函数的实例的机制
检查某个变量是否已经被声明这样的需求,可能没那么必要有自己的运算符.

以上这篇js中判断变量类型函数typeof的用法总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
html中使用javascript调用本地程序(exe、doc等)实现代码
Apr 26 Javascript
js的alert弹出框出现乱码解决方案
Sep 02 Javascript
ExtJS判断IE浏览器类型的方法
Feb 10 Javascript
jquery map方法使用示例
Apr 23 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
Sep 26 Javascript
js判断日期时间有效性的方法
Oct 24 Javascript
基于JavaScript怎么实现让歌词滚动播放
Nov 03 Javascript
详解Angular中$cacheFactory缓存的使用
Aug 19 Javascript
浅析Vue项目中使用keep-Alive步骤
Jul 27 Javascript
Vue路由守卫之路由独享守卫
Sep 25 Javascript
layui 地区三级联动 form select 渲染的实例
Sep 27 Javascript
Vue 实现html中根据类型显示内容
Oct 28 Javascript
详解js实现线段交点的三种算法
Aug 09 #Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
Aug 09 #Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
Aug 09 #Javascript
引用jquery框架后出错的解决方法
Aug 09 #Javascript
js实现常用排序算法
Aug 09 #Javascript
VC调用javascript的几种方法(推荐)
Aug 09 #Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 #Javascript
You might like
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
子页向父页传值示例
2013/11/27 Javascript
JSON 必知必会 观后记
2016/10/27 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
javascript计算对象长度的方法
2017/10/25 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
Python threading多线程编程实例
2014/09/18 Python
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
python跳出双层for循环的解决方法
2019/06/24 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
python 中不同包 类 方法 之间的调用详解
2020/03/09 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
印尼购物网站:iLOTTE
2019/10/16 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
班主任经验交流会主持词
2014/04/01 职场文书
小学生演讲稿大全
2014/04/25 职场文书
养成教育经验材料
2014/05/26 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
公司合作意向书范文
2014/07/30 职场文书
教师节寄语2015
2015/03/23 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
python基础之爬虫入门
2021/05/10 Python
在python中读取和写入CSV文件详情
2022/06/28 Python