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()); //
js高阶函数--判断数据类型、函数胡柯里化;的更多相关文章
- 【 js 基础 】【 源码学习 】柯里化和箭头函数
最近在看 redux 的源码,代码结构很简单,主要就是6个文件,其中 index.js 负责将剩余5个文件中定义的方法 export 出来,其他5个文件各自负责一个方法的实现. 大部分代码比较简单,很 ...
- JS高阶编程技巧--compose函数
先看代码: let fn1 = function (x) { return x + 10; }; let fn2 = function (x) { return x * 10; }; let fn3 ...
- 高阶函数 实现sum(2)(3) 柯里化
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JS高阶编程技巧--惰性函数
在vue.react等框架大量应用之前,我们需要使用jQuery或者原生js来操作dom写代码,在用原生js进行事件绑定时,我们可以应用DOM2级绑定事件的方法,即:元素.addEventListen ...
- js高阶函数应用—函数柯里化和反柯里化
在Lambda演算(一套数理逻辑的形式系统,具体我也没深入研究过)中有个小技巧:假如一个函数只能收一个参数,那么这个函数怎么实现加法呢,因为高阶函数是可以当参数传递和返回值的,所以问题就简化为:写一个 ...
- js 高阶函数之柯里化
博客地址:https://ainyi.com/74 定义 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且 ...
- 前端面试手写代码——JS函数柯里化
目录 1 什么是函数柯里化 2 柯里化的作用和特点 2.1 参数复用 2.2 提前返回 2.3 延迟执行 3 封装通用柯里化工具函数 4 总结和补充 1 什么是函数柯里化 在计算机科学中,柯里化(Cu ...
- JavaScript函数柯里化的一些思考
1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函 ...
- 浅析 JavaScript 中的 函数 currying 柯里化
原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...
随机推荐
- 《剑指offer》---字符串的全排列
本文算法使用python3实现 1.问题一 1.1 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc ...
- HASH表的实现(拉链法)
本文的一些基本概念参考了一部分百度百科,当然只保留了最有价值的部分,代码部分完全是自己实现! 简介 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据 ...
- WriteLine(ls.ToString());Console.WriteLine(ls);输出结果相同,为什么要加 .ToString()
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test ...
- 错误 10 非静态的字段、方法或属性“Test10.Program.a”要求对象引用
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test ...
- 钉钉 E应用 打开分享外链
钉钉 E应用 打开分享外链 外部链接 https://open-doc.dingtalk.com/microapp/dev https://open-doc.dingtalk.com/microapp ...
- 【.Net】c# 中config.exe 引发的一些问题
public static void CreateConfig(){ //c#可以添加内置的app.config,我们通过ConfigrationManager类可以 //可以很轻松的操作相关节点,操 ...
- [洛谷P1452]Beauty Contest
题目大意:给你$n$个点,求出其中最远点的距离 题解:求出凸包,最远点一定都在凸包上,可以对每条边求出最远的点(可以双指针),然后求出和这条边的端点的距离,更新答案 卡点:最开始对每个点求出最远点,但 ...
- LOJ2351:[JOI2017/2018决赛]毒蛇越狱——题解
https://loj.ac/problem/2351 参考:https://www.cnblogs.com/ivorysi/p/9144676.html 但是参考博客讲解太吓人了,我们换一种通俗易懂 ...
- [bzoj] 2049 洞穴勘探 || LCT
原题 这是一道LCT的板子题. 至于LCT--link cut tree,也叫动态树,用splay实现动态连边的树. 预备知识: 实边:一个非叶节点,向它的儿子中的一个连一条特殊的边,称为实边;该非叶 ...
- POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理)
POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理) 题意分析 不妨设日期为x,根据题意可以列出日期上的方程: 化简可得: 根据中国剩余定理求解即可. 代码总览 #include & ...