所有 typeof 返回值为 “object” 的对象(如数组)都包含一个内部属性 [[Class]](可以把它看作一个内部的分类,而非传统的面向对象意义上的类)。此属性无法直接访问, 一般通过 Object.prototype.toString(..) 来查看。例如:

    1. Object.prototype.toString.call( [1,2,3] );
    2. // "[object Array]"
    3. Object.prototype.toString.call( /regex-literal/i );
    4. // "[object RegExp]"

    多数情况下,对象的内部 [[Class]] 属性和创建该对象的内建原生构造函数相对应。

    1. Object.prototype.toString.call( null );
    2. // "[object Null]"
    3. Object.prototype.toString.call( undefined );
    4. // "[object Undefined]"

    虽然 Null() 和 Undefined() 这样的原生构造函数并不存在,但是内部 [[Class]] 属性值仍然是 “Null” 和 “Undefined”。
    其他基本类型值(如字符串、数字和布尔)的情况跟上述不同,通常称为“包装”:

    1. Object.prototype.toString.call( "abc" );
    2. // "[object String]"
    3. Object.prototype.toString.call( 42 );
    4. // "[object Number]"
    5. Object.prototype.toString.call( true );
    6. // "[object Boolean]"