1.判断对象数据类型
示例代码如下
const isType = (type) => (target) => `[object ${type}]` === Object.prototype.toString.call(target)
const isArray = isType('Array')
const isObject = isType('Object')
const isBoolean = isType('Boolean')
console.log(isArray({}))
console.log(isObject({}))
console.log(isBoolean(false))
知识拓展
- js 一共有五种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(代表创建后独一无二且不可变的数据类型)、BigInt(表示任意精度格式的整数)
- 复杂(引用)数据类型:对象、数组和函数
- 二者之间的区别:存储位置不同
1、基本数据类型存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;
2、复杂数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;在栈中存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
3、注:在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值
参考:https://blog.csdn.net/jiangjuanjaun/article/details/80327342
代码解析
- JavaScript 调用 toString 方法将对象转换为一个原始值;
- 要将基本的 Object.prototype.toString() 用于重写的对象(或者在 null 或 undefined 上调用它),
需要在它上面调用 Function.prototype.call() 或者 Function.prototype.apply(),将要检查的对象作为第一个参数传递(称为 thisArg) - Object.prototype.toString() 返回 "[object Type]",这里的 Type 就是对象的类型
注意,target 和 type 不是同一个值,它们分别指代不同的参数。
type 是一个字符串参数,它传递给 isType 函数作为外部函数的参数,如isType('Array')里的Array。
而target 参数是通过返回的内部函数传递进来的。当调用返回的内部函数时,它接受一个参数,这个参数就是 target,表示我们要检查的目标对象,如isArray({})中的{}
- 总的说来,target 是 isType 高阶函数返回的内部函数的参数,它指的是作为参数传递给内部函数的值,即最外层函数传的值