javascript之typeof、instanceof操作符使用探讨


Posted in Javascript onMay 19, 2013

写javascirpt代码时,typeof和instanceof这两个操作符时不时就会用到,堪称必用。但是!使用它们总是不能直接的得到想要的结果,非常纠结,普遍的说法认为“这两个操作符或许是javascript中最大的设计缺陷,因为几乎不可能从他们那里得到想要的结果”
typeof
说明:typeof返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function。
从说明来看,貌似没什么问题。

下面的代码写了一个数值变量,typeof后的结果是"number"。

var a = 1; 
console.log(typeof(a)); //=>number

如果用Number类型的构造函数new一个变量的话,typeof后的结果是"object"。
var a = new Number(1); 
console.log(typeof(a)); //=>object

上面的这两个输出结果看似没啥问题,这一点从书上看来是理所当然的事情,因为javascript就是这么设计的。

但是!问题就在于既然调用了typeof就应该准确返回一个变量的类型,不管是直接用值创建的还是用类型的构造函数创建的,否则!我还用你做啥!
那么对于:

var a = 1; 
var b = new Number(1);

a和b变量的类型准确的说来都应该是Number才是想要的结果。
而准确的类型信息保存在变量的内部属性 [[Class]] 的值中,通过使用定义在 Object.prototype 上的方法 toString来获取。

获取类型信息:

var a = 1; 
var b = new Number(1); 
console.log(Object.prototype.toString.call(a)); 
console.log(Object.prototype.toString.call(b));

输出:
[object Number] 
[object Number]

是不是已经很直接了,我们稍微处理一下,得到直接结果:
var a = 1; 
var b = new Number(1); 
console.log(Object.prototype.toString.call(a).slice(8,-1)); 
console.log(Object.prototype.toString.call(b).slice(8,-1));

输出:
Number
Number
这就是想要的结果。
为了更好的使用,我们封装一个方法,用来判断某个变量是否是某种类型:
function is(obj,type) { 
var clas = Object.prototype.toString.call(obj).slice(8, -1); 
return obj !== undefined && obj !== null && clas === type; 
}

定义一些变量做过测试,先来看看它们的typeof输出:
var a1=1; 
var a2=Number(1); 
var b1="hello"; 
var b2=new String("hello"); 
var c1=[1,2,3]; 
var c2=new Array(1,2,3); 
console.log("a1's typeof:"+typeof(a1)); 
console.log("a2's typeof:"+typeof(a2)); 
console.log("b1's typeof:"+typeof(b1)); 
console.log("b2's typeof:"+typeof(b2)); 
console.log("c1's typeof:"+typeof(c1)); 
console.log("c2's typeof:"+typeof(c2)); 
输出: 
a1's typeof:number 
a2's typeof:object 
b1's typeof:string 
b2's typeof:object 
c1's typeof:object 
c2's typeof:object

我们再用新作的函数是一下:
console.log("a1 is Number:"+is(a1,"Number")); 
console.log("a2 is Number:"+is(a2,"Number")); 
console.log("b1 is String:"+is(b1,"String")); 
console.log("b2 is String:"+is(b2,"String")); 
console.log("c1 is Array:"+is(c1,"Array")); 
console.log("c2 is Array:"+is(c2,"Array")); 
输出: 
a1 is Number:true 
a2 is Number:true 
b1 is String:true 
b2 is String:true 
c1 is Array:true 
c2 is Array:true

注:typeof也不是无用,实际用处是用来检测一个变量是否已经定义或者是否已经赋值。
instanceof
说明:判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例。
instanceof 操作符用来比较两个内置类型的变量时一样力不从心,同样会对结果不满意。
console.log("abc" instanceof String); // false 
console.log("abc" instanceof Object); // false 
console.log(new String("abc") instanceof String); // true 
console.log(new String("abc") instanceof Object); // true

只有在比较自定义的对象时才准确反映关系。
function Person() {} 
function Man() {} 
Man.prototype = new Person(); 
console.log(new Man() instanceof Man); // true 
console.log(new Man() instanceof Person); // true
Javascript 相关文章推荐
JS随机生成不重复数据的实例方法
Jul 17 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
原生js和jQuery写的网页选项卡特效对比
Apr 27 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
JS遍历数组及打印数组实例分析
Jan 21 Javascript
浅析$.getJSON异步请求和同步请求
Jun 06 Javascript
AngularJS常见过滤器用法实例总结
Jul 06 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
Oct 11 Javascript
JS实现马赛克图片效果完整示例
Apr 13 Javascript
javascript数据类型中的一些小知识点(推荐)
Apr 18 Javascript
Vue项目配置跨域访问和代理proxy设置方式
Sep 08 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
May 19 #Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
May 19 #Javascript
JavaScript中几个重要的属性(this、constructor、prototype)介绍
May 19 #Javascript
js函数中onmousedown和onclick的区别和联系探讨
May 19 #Javascript
下拉菜单点击实现连接跳转功能的js代码
May 19 #Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
May 19 #Javascript
固定背景实现的背景滚动特效示例分享
May 19 #Javascript
You might like
JAVA/JSP学习系列之四
2006/10/09 PHP
PHP控制网页过期时间的代码
2008/09/28 PHP
hessian 在PHP中的使用介绍
2010/12/13 PHP
linux系统上支持php的 iconv()函数的方法
2011/10/01 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
PHP类的封装与继承详解
2015/09/29 PHP
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
javascript读取xml实现javascript分页
2013/12/13 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
HTML5之WebSocket入门3 -通信模型socket.io
2015/08/21 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
vue插件实现v-model功能
2018/09/10 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
python使用代理ip访问网站的实例
2018/05/07 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
python 为什么说eval要慎用
2019/03/26 Python
Python GUI编程完整示例
2019/04/04 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
送货司机岗位职责
2013/12/11 职场文书
中学生差生评语
2014/01/30 职场文书
中学生操行评语
2014/04/24 职场文书
企业文化理念标语
2014/06/10 职场文书
安全生产先进个人总结
2015/02/15 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python