【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 5 函数式编程
来源:互联网 发布:bootstrap.js 编辑:程序博客网 时间:2024/05/18 03:15
在知乎上有人推荐的这本书,抱着试试看的态度在图书馆借了本,只有160+页,完全不像C++Primer Plus或其他编程书动辄800+pages。但是这本书主要是从编程思想上来由浅入深写一些作者的心得体会,好多地方自己之前都没有想过,也没有实践过,总之这书写的比较叼,应该多看几遍。
Chapter 5 函数式编程
本章主要讲了一些函数编程抽象思想及技巧,粗略的读了一遍,学到了些皮毛,有空回来再多看几遍,相信会有更多收获。
一、 throw+catch+try
程序处理用户错误输入常用!
二、 字符串链接问题
方案一、以空字符开始,接着使用“+=”操作符添加新内容;
方案二、使用数组保存字符串,然后调用join方法;
创建一个新字符串,尤其是大字符串,对于计算机来说是很大的工作量。方案一每一步都要创建一个新的字符串,并且只有在连接下一个字符时才会被丢弃。方案二将所有的小字符都保存在数组里,然后使用join连接,那么将只能创建一个大的新字符串。
三、 其他函数技巧
1. 操作符函数
由于JavaScript里的操作符都不是函数,每次需要时我们都不得不定义一个add函数。一个解决方案是自己创建一个对象:
var op = { "+": fucntion(a, b){return a + b;}, "==": fucntion(a, b){return a == b;}, "===": function(a, b){return a === b;}, "!": function(a){return !a;} };
这样就可以编写
reduce(op["+"], 0 ,[1, 2, 3, 4, 5])
来统计数组的和。
2. 分布应用
如果我们需要一个函数,需要比较其参数是否为 0 或者将 1 添加到参数上,我们需要写一个新函数。针对这种情况,分布应用就派上用场了。接收一个函数 X 和一个或多个参数,然后创建一个新函数调用 X ,用到原来的参数和新传入的参数。(不得不说建议看英文版,中文版翻译的有点儿糟,有的地方想看懂翻译的意思比较困难。)
例如,partial(op[“*”], 5) 应该返回一个将参数进行5次相乘的新函数。可以使用函数的 apply 方法来定义这个分布:
function partial(func){ var knownArgs = arguments;//knownArgs变量是必须的,因为在内部函数里,arguments变量引用的是内部函数的参数而不是partial函数的参数。 return function(){ var realArgs = []; for(var i = 1; i < knownArgs.length; i++) realArge.push(knownArgs[i]);//arguments是伪数组,不能用concat方法复制。为解决该问题,手动复制他们。由于外部函数的第一个参数是要包装的函数,不是必须要复制的参数,所以第一个循环从 1 开始。 for(var i = 0; i < arguments.length; i++) realArgs.push(arguments[i]); return func.apply(null, realArgs); };}
测试:
map(partial(op["+"], 1), [0, 2, 4, 6, 8, 10]);
——》[1, 3, 5, 7, 9, 11]
3. 组合
遇到多种函数值时可采用的最后一个技巧是函数组合。核心思想:调用函数 A ,然后应用函数 B 得出结果。组合在数学里是个常见的概念,它可以表示为如下的高阶函数:
function compose(f1, f2){ return function(){ return f1(f2.apply(null, arguments)); }}
示例:
var isNotNaN = compose(op["!"], isNaN);isNotNaN(5);
——》true
这里定义了一个新函数功能,没有使用 function 关键字。这样的定义通常都很短,当我们想创建一个简单函数的时候非常适用,例如,map函数或者 reduce 函数。
像这样定义函数运行速度会有点儿慢,因为它们要添加更多的简介函数调用。大多数时候没大问题,大部分代码的执行都将少于 1 次/秒,因而多出几微秒也不会很明显。但对于一秒钟要调用几千次的函数,应该考虑直接编写函数。
- 【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 5 函数式编程
- 【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 2 函数
- 【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 6 面向对象编程
- 【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 4 错误处理
- 【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 11 浏览器事件
- 《Eloquent JavaScript》笔记--函数;
- JavaScript编程随笔
- 【js】JavaScript与函数式编程
- javascript函数式编程库-underscore.js
- JavaScript函数式编程
- JavaScript函数式编程
- javaScript函数式编程
- JavaScript函数式编程
- JavaScript 函数式编程
- JavaScript 函数式编程
- JavaScript ---- 函数式编程
- JavaScript 函数式编程
- 函数式JavaScript编程指南
- CURL POST请求上传图片
- 判断以逗号分隔的字符串中是否包含某个数
- 判断大小端
- 线程Looper+Handler+Thread学习
- js 定时跳转
- 【JS/读书随笔】JavaScript编程精解/Eloquent JavaScript:Chapter 5 函数式编程
- destoon分页的不能显示的原因
- Android自定义组件之日历控件-精美日历实现(内容、样式可扩展)
- Binary Tree Paths
- 树结构练习——排序二叉树的中序遍历
- android开发中常用到的类和一些方法的相关介绍!~
- Reveal UI 分析工具简单使用
- 正则表达式matcher.group用法
- http://zhongfox.github.io/blog/server/2013/05/12/nginx-var/