类型判断 typeof, instanceof,Object.prototype.toString.call

304 阅读1分钟

typeof

操作符返回一个字符串,表示未经计算的操作数的类型

  1. typeof 对于基本类型,除了 null 都可以显示正确的类型。
  2. typeof 对于对象,除了函数都会显示 object
  3. 除 Function 外的所有构造函数的类型都是 'object'

在 JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null 的类型标签是 0,typeof null 也因此返回 "object"

instanceof

是判断变量是否为某个对象的实例,返回值为true或false

instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
        //A的内部属性__proto__指向B的原型对象
        return true;
    }
    return false;
}

继承情况

function Parent(){};
function Child(){};
function Other(){};

Child.prototype = new Parent();
let child = new Child();

child instanceof Child; // true
child instanceof Parent; // true
child instanceof Object; // true
child instanceof Other; // false

// 原因
Parent.prototype.__proto__ === Object.prototype

Object.prototype.toString.call

每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型

其他类型将 toString 方法重写,所以返回其他值,当时使用 Object.prototype.toString.call 时其他类型会返回对应的 [object type]

代码示例