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 中,原始值和特殊值通常通过严格相等运算符(===
)进行检查。然而,对于对象和数组等引用类型,这个函数提供了一种更可靠的类型检查方法。