weishenHong / todo-and-infos

一些待办事项和技术相关信息收集
1 stars 0 forks source link

Instanceof #30

Open weishenHong opened 1 year ago

weishenHong commented 1 year ago

关于类型检查

常用的方式:Object.prototype.toString

Object.prototype.toString是位于 JavaScript 的对象原型上的方法,因为几乎所有的 JavaScript 对象都继承自 Object,这包括字符串、数字、数组、函数等。由于它是位于所有对象原型上的共同方法,因此可以用来检测不同类型的值,包括字符串和数字。

具体原理是 Object.prototype.toString 方法内部会访问调用它的对象的 [[Class]] 属性,该属性是每个 JavaScript 值内部的属性,用于标识其类型。不同类型的值具有不同的 [[Class]] 值,例如:

字符串的 [[Class]] 值是 "String" 数字的 [[Class]] 值是 "Number" 数组的 [[Class]] 值是 "Array" 函数的 [[Class]] 值是 "Function" 对象的 [[Class]] 值是 "Object" 例如

function isArray(value) {
  return Object.prototype.toString.call(value) === '[object Array]';
}

谈谈 typeof 的缺陷;

对象类型的限制: typeof 无法准确区分对象和数组,它们都会被判断为 'object'。 对于 null 值,typeof 会将其判断为 'object',这是一个历史遗留问题,被认为是 JavaScript 设计的错误。

Instanceof

instanceof 运算符适合用于以下情况作为类型检查的方式:

  1. 检查对象的构造函数: instanceof 可以用来检查一个对象是否是由特定构造函数创建的。这在检查自定义对象的类型时非常有用。

    function Person(name) {
     this.name = name;
    }
    
    const person = new Person("Alice");
    
    if (person instanceof Person) {
     console.log("person 是 Person 类型的实例");
    }
  2. 检查继承关系: instanceof 可以用于检查一个对象是否是某个类的实例或是其子类的实例。这对于检查对象是否继承了某个类的属性和方法很有用。

    class Animal {
     speak() {
       console.log("动物发出声音");
     }
    }
    
    class Dog extends Animal {
     bark() {
       console.log("狗吠声");
     }
    }
    
    const dog = new Dog();
    
    if (dog instanceof Animal) {
     console.log("dog 是 Animal 类型的实例");
    }
  3. 检查数组类型: instanceof 可以用来检查一个对象是否是数组类型。虽然可以使用 Array.isArray() 方法来检查数组,但 instanceof 也是一种可选的方式。

    const arr = [1, 2, 3];
    if (arr instanceof Array) {
     console.log("arr 是数组类型");
    }

请注意,instanceof 只能用于检查对象是否是由特定构造函数创建的实例,而不能用于检查原始数据类型(如字符串、数字等)。对于原始数据类型的类型检查,你应该使用其他方式,如 typeof。此外,instanceof 在处理跨不同窗口或框架的对象时可能会出现问题,因为它检查对象的原型链,而原型链可能会在不同环境中有不同的对象结构。