一、判断数据类型;

常见的判断有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()); //

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

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

    最近在看 redux 的源码,代码结构很简单,主要就是6个文件,其中 index.js 负责将剩余5个文件中定义的方法 export 出来,其他5个文件各自负责一个方法的实现. 大部分代码比较简单,很 ...

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

    先看代码: let fn1 = function (x) { return x + 10; }; let fn2 = function (x) { return x * 10; }; let fn3 ...

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

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

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

    在vue.react等框架大量应用之前,我们需要使用jQuery或者原生js来操作dom写代码,在用原生js进行事件绑定时,我们可以应用DOM2级绑定事件的方法,即:元素.addEventListen ...

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

    在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...

  6. js 高阶函数之柯里化

    博客地址:https://ainyi.com/74 定义 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且 ...

  7. 前端面试手写代码——JS函数柯里化

    目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...

  8. JavaScript函数柯里化的一些思考

    1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...

  9. 浅析 JavaScript 中的 函数 currying 柯里化

    原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...

随机推荐

  1. dataTables工作总结

    近期在工作中用到了dataTables,现在总结一下在工作中遇到的问题以及解决方法,如有不妥之处希望多多指教,定会改进. 首先这里用的是coloradmin框架,在vs环境下开发. 这里写一个容器用于 ...

  2. ava中普通代码块,构造代码块,静态代码块区别及示例

    //执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 //普通代码块:在 ...

  3. animate.css与wow.js制作网站动效

    animate.css 官网:https://daneden.github.io/animate.css/ 包括:attention seekers:关注者 bouncing entrances:跳跃 ...

  4. C# 饼形图

    原文链接:https://www.cnblogs.com/icyJ/archive/2012/10/08/Chart_Pie.html 需要实现的目标是: 1.将数据绑定到pie的后台数据中,自动生成 ...

  5. table与div互相嵌套注意

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. 【转】how can i build fast

    http://blog.csdn.net/pcliuguangtao/article/details/5830860

  7. java 中使用Base64

    byte[] cipherData = Base64.encodeBase64(plainText.getBytes()); //默认不换行 byte[] cipherData = Base64.en ...

  8. BZOJ 1797 最小割(最小割割边唯一性判定)

    问题一:是否存在一个最小代价路径切断方案,其中该道路被切断? 问题二:是否对任何一个最小代价路径切断方案,都有该道路被切断? 现在请你回答这两个问题. 最小割唯一性判定 jcvb: 在残余网络上跑ta ...

  9. [牛客Wannafly挑战赛27D]绿魔法师

    description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...

  10. 关于PDO取得结果集的数据类型为string的问题

    很久没写些什么了, 正好今天工作中遇到了以前在意过的问题. 之前曾注意到过,php从数据库中取得的结果集后,其中的字段全都会变成string类型.今儿通过ajax调取数据, 有一个type字段是int ...