typeOf、instanceOf、valueOf区别

2016-04-14  本文已影响622人  Point_halo

一、typeOf

typeof操作符返回一个字符串,表示未经求值的操作数(unevaluated operand)的类型

Js中对象一共有六种主要类型

Paste_Image.png

可以看到typeOf并不能判断出Array和null以及object之间的区别

注:null和{}的typeOf结果相同是因为不同的对象在底层都表示为二进制对象,js中前三位都为0的话会被判断为object类型
,null的二进制表示全是0,所以执行typeOf会返回object

扩展:

要想判断是不是数组的话,可以
// 使用Array.isArray或者Object.prototype.toString.call方法可以从基本的对象中区分出数组类型

方法一:

e.g Array.isArray

var a=[]; Array.isArray(a); //true;
var a={}; Array.isArray(a); //false;
var a=function(){}; Array.isArray(a); //false;

如果不存在Array.isArray(),需要自定义方法(实际上就是用object.prototype.toString.call),ie9+才支持Array.isArray()

if(!Array.isArray){
Array.isArray=function(arg){
return Object.prototype.toString.call(arg)==='[object Array]';
}
}
方法二、

更准确地判断出对象的类型(不止可以用来判断数组)
e.g object.prototype.toString.call
返回的结果是'[object result]'这样的形式,使用slice截取指定区域的字符串就可以得到对象的类型

Paste_Image.png Paste_Image.png

二、instanceOf

MDN中的原话描述是这样的:

instanceof运算符可以用来判断某个构造函数的prototype属性所指向的對象是否存在于另外一个要检测对象的原型链上,
检测constructor.prototype 是否存在于参数 object 的原型链上

a instanceOf b 其实就是检测a是不是b的一个实例对象或者是b的子类的一个实例对象

判断一个实例是否属于某种类型

还可以在继承关系中判断一个实例是否属于它的父类型

// 判断 foo 是否是 Foo 类的实例 , 并且是否是其父类型的实例
function Parent(){} 
function Child(){} 
Child.prototype = new Parent();//原型继承
 
var child = new Child(); 
console.log(child  instanceof Child)//true 
console.log(child  instanceof Parent)//true

这里就涉及到了原型链的相关知识了
暂挂起不表,下一篇文章详细写这个

三、valueOf

var boo=new Boolean(false);
console.log(boo.valueOf()) //false
var boo=new String('test');
console.log(boo.valueOf()) //test
var boo='test';
console.log(boo.valueOf()) //test
var boo=[2,3];
console.log(boo.valueOf()) //[2,3]
var boo=456; 
console.log(boo.valueOf()) // 456
var boo=new Date();
console.log(boo.valueOf()) //1460605379960
var boo={};
console.log(boo.valueOf())  //Object {}

var boo={'data':2};
console.log(boo.valueOf()) //Object {data: 2}

参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof

上一篇 下一篇

猜你喜欢

热点阅读