const toString = Object.prototype.toString;export function is(val: unknown, type: string) {return toString.call(val) === `[object ${type}]`;
}
这段代码定义了一个名为 is 的函数,用于检查一个值 val 是否是特定类型的对象。这个函数利用了 Object.prototype.toString 方法来获取值的内部 [[Class]] 属性,并将其格式化为一个字符串,以便与期望的类型进行比较。
这里是函数的详细解释:
-
toString变量:首先,通过const toString = Object.prototype.toString;语句,将Object.prototype.toString方法赋值给局部变量toString。这样做是为了在函数内部方便调用,并且避免在调用时因为this值不正确而导致的问题(尽管在这个特定的使用场景中,this值不会影响Object.prototype.toString的行为,但这是一种常见的最佳实践)。 -
is函数:export function is(val: unknown, type: string)定义了一个导出的函数is,它接受两个参数:val(要检查的值)和type(期望的类型名称,如"Array"、"Object"、"String"等)。 -
类型检查:在函数体内,通过调用
toString.call(val)获取val的内部[[Class]]属性,并将其格式化为一个字符串。然后,这个字符串与模板字符串[object ${type}]生成的字符串进行比较。如果它们相等,说明val是期望的类型。 -
返回值:函数返回一个布尔值,表示
val是否是指定类型的对象。 -
使用 TypeScript:函数使用了 TypeScript 的类型注解。
val: unknown表示val可以是任何类型的值,这是一种安全的做法,因为它不假设val的任何具体类型。type: string表示type参数应该是一个字符串,即类型的名称。 -
使用场景:这个函数可以用于各种类型检查场景,特别是在处理不确定类型的数据时。与直接使用
instanceof操作符相比,这种方法更可靠,因为它不受原型链修改的影响。 -
示例:
typescript复制代码
console.log(is([], 'Array')); // true | |
console.log(is({}, 'Object')); // true | |
console.log(is('hello', 'String')); // true | |
console.log(is(123, 'Number')); // true | |
console.log(is(true, 'Boolean')); // true | |
console.log(is(null, 'Null')); // false,因为 null 不是一个对象,没有 [[Class]] 属性 | |
console.log(is(undefined, 'Undefined')); // false,同样因为 undefined 不是一个对象 |
注意,对于原始类型(如 string、number、boolean)和特殊值(如 null 和 undefined),虽然这个函数在格式上保持一致,但实际上这些值并不是对象,因此它们的内部 [[Class]] 属性(如果存在的话)不会以这种方式暴露出来。在 JavaScript 中,原始值和特殊值通常通过严格相等运算符(===)进行检查。然而,对于对象和数组等引用类型,这个函数提供了一种更可靠的类型检查方法。
