所有typeof返回值为“object” 的对象(如数组)都包含一个内部属性([[Class]])(我们可以把它看做一个内部的分类,而非传统的面相对象意义上的类)这个属性无法直接访问,一般通过Object.prototype.toString(...)来查看例如:
Object.prototype.toString.call([1,2,3]);
//"[object Array]"
Object.prototype.toString.call(/regex-literal/i);
//"[object RegExp]"
上例中数组的内部[[Class]]的属性值是“Array” 正则表达式的值是“RegExp” 多数情况下,对象的内部[[Class]] 属性和创建该对象的内建原生构造函数相对应,但并非如此
那么基本类型呢,来看下null和undefined
Object.prototype.toString.call(null);
//"[object Null]"
Object.prototype.toString.call(undefined)
//"[object undefined]"
虽然Null() 和undefined()这样的原生构造函数不存在,但是内部的[[Class]]属性值仍然是"Null"和“Undefined”
其他的基本类型值(如字符串。数字和布尔)的情况有所不同,通常称为包装
Object.prototype.toString.call('abc');
//"[object String]"
object.prototype.toString.call(42);
//"[object Number]"
object.prototype.toString.call(true);
//"[object Boolean]"
上面的基本类型值被各自的封装对象自动包装,所以他们的内部[[Class]]属性值分别为“String”."Number""Boolean"