zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    面向对象(Object Oriented)
    文件操作
    函数
    dict--字典
    list--列表
    Ubuntu_18.04安装网易云音乐
    初识数据类型
    css控制内容显示,自动加"..."
    css固定元素位置(fixed)
    解决IE下iframe默认有白色背景的bug
  • 原文地址:https://www.cnblogs.com/jone-chen/p/5591639.html
Copyright © 2011-2022 走看看