1.typeof:
typeof 右侧跟一个一元表达式,返回表达式的数据类型。
<script>
console.log(typeof 'a');//string
console.log(typeof 2);//number
console.log(typeof true);//boolean
console.log(typeof Symbol());//Symbol
console.log(typeof undefined);//undefined
console.log(typeof new Function());//function
console.log(typeof null);//object
console.log(typeof [2,3]);//object
</script>
由代码我们可以知道,typeof方法有时无法返回我们想要的效果。
总结:
(1)当typeof判断除null之外的基本数据类型时,都可以返回正确的结果。
(2)当typeof判断除function之外的引用数据类型时,都返回的是原型链顶端的Object类型。
2.instanceof:
instanceof 是用来判断 a是否为 b的实例,instanceof运算符需要指定一个构造函数,或者说指定一个特定的类型,它用来判断这个构造函数的原型是否在给定对象的原型链上。表达式为:a instanceof b,如果 a是 b 的实例,则返回 true,否则返回 false。
代码:
<script>
let num = 123;
console.log(123 instanceof Number);//false
console.log(num instanceof Number);//false
console.log('acdjboq' instanceof String);//false
console.log(true instanceof Boolean);//false
console.log(false instanceof Boolean);//false
console.log(undefined instanceof Object)//false
console.log(null instanceof Object);//false
console.log(
[1, 2, 3] instanceof Array, //true
{ a: 1, b: 2, c: 3 } instanceof Object, //true
function () { console.log('aaa'); } instanceof Function, //true
new Date() instanceof Date, //true
/^[a-zA-Z]{5,20}$/ instanceof RegExp, //true
new Error() instanceof Error //true
);
</script>
由代码可见,instanceof在判断基本数据类型时,不能正确的返回值。但是我们可以用生成实例的方法来判断属于哪种类型。代码如下:
<script>
var num=new Number(123);
console.log(num instanceof Number);//true
var str=new String('aabbcc');
console.log(str instanceof String);//true
var boolean=new Boolean(false);
console.log(boolean instanceof Boolean);//true
//.....
</script>
注意:由于null和undefined的类型是它们自身,所以返回的也是false.
总结:instanceof只能判断引用数据类型且是由构造函数生成的实例的数据类型。
下面我们来用代码演示instanceof的原理:
<script>
function _instance_of(left,right){
const instanceLeft=left.__proto__;
const constructorRight=right.prototype;
if(instanceLeft===constructorRight){
console.log('true');
}else{
console.log('false');
}
}
_instance_of(4,Number);//true
_instance_of([1,2,3],Array);//true
_instance_of(false,Boolean);//true
_instance_of('a',String);//true
_instance_of({relname:'张三',age:18},Object);//true
</script>
3.constructor:
constructor和instanceof的用法和原理是类似的,它也是利用原型链来判断的。xxx.constructor===数据类型,如果生成实例的构造函数等于右侧的数据类型,则返回TRUE。
代码演示:
<script>
let arr=new Array(1,2,3);
let obj=new Object({relname:'张三',age:18});
let fn=new Function();
console.log(arr.constructor===Array);//true
console.log(obj.constructor===Object);//true
console.log(fn.constructor===Function);//true
</script>