对于typeof和instanceof,我们经常用来检测数据的类型。typeof可以检测Number、Boolean、String、Undefined、Function类型,对于其他类型的数据都返回为object;而instanceof可以弥补这一不足,也就是说最常用检测数组可以用arr instanceof Array就可以,当然,es5给我们提供了一个新方法isArray。
这里我要说的是自己遇到的一个问题,当使用instanceof去检测Sting类型的数据时,返回为false,Boolean和Number、Undefined也是这样,感到很奇怪,所以查了一些资料,发现了一些之前没注意过的东西。
JavaScript中的基本数据类型时6种,但是JavaScript有五种原始类型(字符串、数字、布尔值、null 和 undefined)。基本数据类型就是平时我们定义变量的类型,而一个js字面量是属于原始类型的。证明如下:
var str1 = "javascrpt";
str1 instanceof String//返回false
var str2 = new String('javascript');
str2 instanceof String //返回true
instanceof检测对象的构造器以及原型链,而js字面量是属于原始数据类型,跟String Object是不一样的,原始数据类型String不属于object,具体的可以看ECMA官方规范(http://www.ecma-international.org),所以instanceof的时候自然返回的是false。
而我们定义字面量之后却可以使用相关的方法,这又是为什么呢,ECMA官方规范中介绍,当一个原始类型的数据(比如String类型),去调用相关方法时会被强制转化为String Object,所以不回报错。
大神的解释:https://www.zhihu.com/question/28516968