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;
        }
    }
};
时间: 2024-07-30 20:20:34

js高阶函数--判断数据类型、函数胡柯里化;的相关文章

【 js 基础 】【 源码学习 】柯里化和箭头函数

最近在看 redux 的源码,代码结构很简单,主要就是6个文件,其中 index.js 负责将剩余5个文件中定义的方法 export 出来,其他5个文件各自负责一个方法的实现. 大部分代码比较简单,很容易看懂,但是在 applyMiddleware.js 中 有一个地方还是很有意思,用到了柯里化和箭头函数的组合.由于增强 store,丰富 dispath 方法的时候,可能会用到多个 中间件,所以这个的嵌套有可能会很深,导致对 箭头函数和柯里化 不是很熟悉的童鞋,一看源码就会有些理不清思路. 一.

JS高阶编程技巧--compose函数

先看代码: let fn1 = function (x) { return x + 10; }; let fn2 = function (x) { return x * 10; }; let fn3 = function (x) { return x / 10; }; console.log(fn3(fn1(fn2(fn1(6))))); 这是几个简单的运算方法,但想输出的是一个多层函数嵌套的运行结果,即把前一个函数的运行结果赋值给后一个函数,当然我们可以写成一下这样: let x = fn1(

高阶函数 实现sum(2)(3) 柯里化

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>高阶函数 实现sum(2)(3)</title> </head> <body> <script type="text/javascript"> function add() { var args = [].slice.call(argum

JS高阶编程技巧--惰性函数

在vue.react等框架大量应用之前,我们需要使用jQuery或者原生js来操作dom写代码,在用原生js进行事件绑定时,我们可以应用DOM2级绑定事件的方法,即:元素.addEventListener(),因为兼容性,还有: 元素.attachEvent().所以我们需要封装成一个方法: function emit(element, type, func) { if (element.addEventListener) { element.addEventListener(type, fun

js高阶函数应用—函数柯里化和反柯里化

在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个只有一个参数的函数,而这个函数返回一个带参数的函数,这样就实现了能写两个参数的函数了(具体参见下边代码)--这就是所谓的柯里化(Currying,以逻辑学家Hsakell Curry命名),也可以理解为一种在处理函数过程中的逻辑思维方式. 1 function add(a, b) { 2 retur

JS函数柯里化

第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了解了后才发现其实就是高阶函数的一个特殊用法. 果然是不管作用怎么样都要有个高端的名字才有用. 首先看看柯里化到底是什么? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 看这个解释有一点抽象,我们就拿被做了无数次示例的add函数

JavaScript函数柯里化的一些思考

1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函数f1和f是等效的,我们直接令var f1 = f;就行了,完全没有必要包裹那么一层. 但是,下面一段代码就未必能够看得出问题来了: var getServerStuff = function(callback){ return ajaxCall(function(json){ return cal

浅析 JavaScript 中的 函数 currying 柯里化

原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果.因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程. 柯里化一个求和函数 按照分步求值,我们看一个

Swift # 柯里化函数

前言 此次文章,讲述的是Swift的一个新特性(柯里化函数),可能很多iOS开发人员是第一次听这个词汇,包括我自己也是,自己也用了几天时间才总结出来,希望能帮助到各位咯,个人感觉偏向有开发经验的码友,如果零基础的看懂,希望能给个赞,??! 如果喜欢我的文章,可以关注我,随着后续不断学习Swift中,陆续还会有更新ing.... 什么是柯里化函数? 柯里化(Currying),又称部分求值(Partial Evaluation),是一种函数式编程思想,就是把接受多个参数的函数转换成接收一个单一参数