// 函数的柯里化 和反柯里化
// 判断变量的类型
// 常用判断类型的方法有四种 typeof instanceof Object.prototype.toString.call();
// 1、typeof 不能判断对象类型 typeof [] typeof {}
// 2、constructor 可以找到这个变量是通过谁构造出来的,({}).constructor
// 3.判断谁是谁的实例 __proto__
// 4.Object.prototype.toString.call(); 缺陷就是不能细分 谁是谁的实例
function isType(value,type){
return Object.prototype.toString.call(value)===`[object ${type}]`;
}
let b=isType([],'Array'); // isString、isArray、
console.log(b);
// 能不能将方法进行细分:
console.log(isType()); */
// 通过一个柯里化函数 实现通用的柯里化方法
/*
function isType(type){
return function(value){
return Object.prototype.toString.call(value)===`[object ${type}]`;
}
} */
1) 函数柯里化通用
function isType(type,value){
return Object.prototype.toString.call(value)===`[object ${type}]`;
}
const currying=(fn,arr=[])=>{
let len=fn.length; // 这里获取的是函数参数的个数
return function (...args){
arr=[...arr,...args];
if(arr.length<len){
return currying(fn,arr)
}else {
return fn(...arr);
}
}
}
let isArray=currying(isType)('Array');
let isString=currying(isType)('String');
console.log(isArray([]),isString('123'));
2) 函数柯里化转化
// 柯里化 把一个大的范围 变成了一个小的范围
function isType(type){
return function(value){
return Object.prototype.toString.call(value)===`[object ${type}]`;
}
}
let isArray=isType('Array');
console.log(isArray('hello'));
console.log(isArray([]));