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 相关文章推荐
讨论javascript(一)工厂方式 js面象对象的定义方法
Dec 15 Javascript
使用js实现关闭js弹出层的窗口
Feb 10 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
AngularJS中的Directive自定义一个表格
Jan 25 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
Apr 20 Javascript
深入理解JavaScript继承的多种方式和优缺点
May 12 Javascript
element-ui的回调函数Events的用法详解
Oct 16 Javascript
详解Vue中的scoped及穿透方法
Apr 18 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
Aug 10 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
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
2019/10/30 PHP
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
使用JS动态显示文本
2017/09/09 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Django自定义用户认证示例详解
2018/03/14 Python
Django 限制用户访问频率的中间件的实现
2018/08/23 Python
对python判断是否回文数的实例详解
2019/02/08 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
环境科学专业大学生自荐信格式
2013/09/21 职场文书
家长会主持词
2014/03/26 职场文书
借款担保书范文
2014/05/13 职场文书
防溺水主题班会教案
2015/08/12 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫