js高阶函数--判断数据类型、函数胡柯里化;
一、判断数据类型;
常见的判断有typeof、instanceof、 constructor、 prototype,先来看typeof;
var a = "hello world"; var b = 10; var c = [1, 3, 5]; var d = new Date(); var e = function() {}; console.log(typeof a); // string console.log(typeof b); // number console.log(typeof c); // object console.log(typeof d); // object console.log(typeof e); // function
其中typeof返回的类型都是字符串形式,需注意,例如:
alert(typeof a == "string") -------------> true
alert(typeof a == String) --------------> false
另外typeof 可以判断function的类型;在判断除Object类型的对象时比较方便。
判断已知对象类型的方法: instanceof。
console.log(c instanceof Array); // true console.log(d instanceof Date); // true console.log(e instanceof Function); // true
注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
根据对象的constructor判断: constructor。
console.log(c.constructor === Array); // true console.log(d.constructor === Date); // true console.log(e.constructor === Function); // true
通用且更好的判断方式:Object.prototype.toString。
Object.prototype.toString.call( obj )返回一个字符串, 比如Object.prototype.toString.call( [1,2,3] ) 总是返回"[object Array]" , 而Object.prototype.toString.call( “str”)总是返回"[object String]"。
console.log(Object.prototype.toString.call(a) === "[object String]"); // true console.log(Object.prototype.toString.call(b) === "[object Number]"); // true console.log(Object.prototype.toString.call(c) === "[object Array]"); // true console.log(Object.prototype.toString.call(d) === "[object Date]"); // true console.log(Object.prototype.toString.call(e) === "[object Function]"); // true
对于Object.prototype.toString,可以编写一个通用的isType函数,代码如下:
var isType = function(type) { return function(obj) { return Object.prototype.toString.call(obj) === "[object " + type + "]"; } }
// 调用 var isString = isType("String"); var isArray = isType("Array"); var isNumber = isType("Number"); var isFunction = isType("Function"); var string = isString("hello world"); var number = isNumber(10); var array = isArray([]); var func = isFunction(function() {}); console.log(string); // true console.log(number); // true console.log(array); // true console.log(func); // true
二、函数的柯里化currying;
函数柯里化(function currying)。currying 的概念最早由俄国数学家MosesSchönfinkel 发明,而后由著名的数理逻辑学家Haskell Curry 将其丰富和发展,currying 由此得名。currying 又称部分求值。一个currying 的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。
通用的function currying(){},
var currying = function(fn) { var args = []; return function() { if (arguments.length === 0) { return fn.apply(this, args); } else { [].push.apply(args, arguments); return arguments.callee; } } };
关于函数的柯里化怎么运用呢?来看一个例子;
var multi = function () { var total = 0; for (var i = 0, c; c = arguments[i++];) { total += c; } return total }; // 函数柯里化通用实现; var currying = function(fn) { var args = []; return function() { if (arguments.length === 0) { return fn.apply(this, args); } else { [].push.apply(args, arguments); return arguments.callee; } } }; var sum = currying(multi); sum(10, 20, 30); sum(60)(60); console.log(sum()); // 180