Open weishenHong opened 1 year ago
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 无法准确区分对象和数组,它们都会被判断为 'object'。 对于 null 值,typeof 会将其判断为 'object',这是一个历史遗留问题,被认为是 JavaScript 设计的错误。
instanceof 运算符适合用于以下情况作为类型检查的方式:
instanceof
检查对象的构造函数: instanceof 可以用来检查一个对象是否是由特定构造函数创建的。这在检查自定义对象的类型时非常有用。
function Person(name) { this.name = name; } const person = new Person("Alice"); if (person instanceof Person) { console.log("person 是 Person 类型的实例"); }
检查继承关系: 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 类型的实例"); }
检查数组类型: instanceof 可以用来检查一个对象是否是数组类型。虽然可以使用 Array.isArray() 方法来检查数组,但 instanceof 也是一种可选的方式。
Array.isArray()
const arr = [1, 2, 3]; if (arr instanceof Array) { console.log("arr 是数组类型"); }
请注意,instanceof 只能用于检查对象是否是由特定构造函数创建的实例,而不能用于检查原始数据类型(如字符串、数字等)。对于原始数据类型的类型检查,你应该使用其他方式,如 typeof。此外,instanceof 在处理跨不同窗口或框架的对象时可能会出现问题,因为它检查对象的原型链,而原型链可能会在不同环境中有不同的对象结构。
typeof
关于类型检查
常用的方式: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" 例如
谈谈 typeof 的缺陷;
对象类型的限制: typeof 无法准确区分对象和数组,它们都会被判断为 'object'。 对于 null 值,typeof 会将其判断为 'object',这是一个历史遗留问题,被认为是 JavaScript 设计的错误。
Instanceof
instanceof
运算符适合用于以下情况作为类型检查的方式:检查对象的构造函数:
instanceof
可以用来检查一个对象是否是由特定构造函数创建的。这在检查自定义对象的类型时非常有用。检查继承关系:
instanceof
可以用于检查一个对象是否是某个类的实例或是其子类的实例。这对于检查对象是否继承了某个类的属性和方法很有用。检查数组类型:
instanceof
可以用来检查一个对象是否是数组类型。虽然可以使用Array.isArray()
方法来检查数组,但instanceof
也是一种可选的方式。请注意,
instanceof
只能用于检查对象是否是由特定构造函数创建的实例,而不能用于检查原始数据类型(如字符串、数字等)。对于原始数据类型的类型检查,你应该使用其他方式,如typeof
。此外,instanceof
在处理跨不同窗口或框架的对象时可能会出现问题,因为它检查对象的原型链,而原型链可能会在不同环境中有不同的对象结构。