两道函数式编程题
题目是由Winter出的,出片在这里>>
Winter出的题,有些我也答不上来,题目难度并不是很高,但还考的比较深入。例如:
JavaScript中的科里化、尾递归及其优化等(因为工作中用到这些的地方并不多)
之前我也整理过,叫《网上收集的十道题》,那些题目,如果只是日常的页面开发,有些也许不会遇到,但如果想深入JavaScript,去研究一下也未尝不是一件好事情。
我所了解的招聘前台开发人员,不同的公司以及部门对前台开发的技能要求会各有所异。
打个比方:(需要熟练掌握如下技能的:切图、XHTML、CSS、JavaScript)的前端开发的公司会问:Web标准、函数式、设计模式、OO、浏览器兼容性以及hasLayout的问题,进(以JavaScript开发为主导的,平时较少需要进行页面切割)的公司,算法是一定会考的,其中编写的JavaScript脚本它的性能和优化问题,CDN、http相关也会问,但这些公司都会问同一个问题:跨域如何处理,方案有哪些,如何选择?
部门、产品需要什么样的人,考察的侧重点会有所不同。但既然是写代码,基本的一些算法还是要会一点,性能优化这个也是很重要的。即使如此,对于编写人员,有些能力也是比较重要的:测试、运营、业务、需求、网络协议等,这些是对某一门开发语言掌握之后附加的能力(过早的涉入可能容易分散对某一门开发语言学习的精力),如果想提升自己的综合能力,上面那些会越来越重要。
只试着解答两道题:
1、写一个函数式风格的菲波纳契数列。
2、写一个函数式风格的快速排序。
第一题:
之前写过,是使用了三种方法:递归、数组缓存、加法,有兴趣可以看这里>>
1: var IterMemoFib = function() {
2: var cache = [1, 1];
3: return function (n) {
4: if (n >= cache.length) {
5: for (var i = cache.length; i < n ; i++ ) {
6: cache[i] = cache[i - 2] + cache[i - 1];
7: }
8: }
9: return cache[n - 1];
10: }
11: }();
第二题:
1: <script type="text/javascript">
2: var arr = [1, 3, 5, 7, 9, 10, 20, 50, 760, 3, 8];
3:
4: function ASC(a, b) {
5: return a - b;
6: }
7:
8: function DES(a, b) {
9: return b - a;
10: }
11:
12: alert(arr.sort(ASC));
13: </script>
不过winter出的另外几道题还是比较有意思的,不注意的话容易掉陷阱里去
1: <script type="text/javascript">
2: var proto = {a:1};
3: function cls() {};
4: var obj1 = new cls();
5: cls.prototype = proto;
6: //obj1.a现在是什么?
7: </script>
注意这里使用的是“=”赋值,等价于cls.prototype = {a:1};
所以obj1.a === undefined
稍微变换一下:
1: <script type="text/javascript">
2: function cls() {};
3: var obj1 = new cls();
4: cls.prototype.a = 1;
5: //obj1.a现在是什么?
6: </script>
这个时候就不一样了,此时obj1从cls的原型上继承了属性’a’,那么obj1.a值就为1了
两者的区别因为形式不同,而导致的意义也完全不一样:
cls.prototype.a = 1; cls.prototype = {a:1}
还有一题:
Function.prototype.ex = function() { this.call(arguments); } 请编写一段代码,调用ex方法,但不能出现Function.prototype,说明其中this代表哪个对象
编写的代码如下:
1: <script type="text/javascript">
2: Function.prototype.ex = function() {
3: this.call(arguments);
4: }
5:
6: function abc() {
7: alert(this.length);
8: }
9:
10: abc.ex(1, 2, 3, 4, 5);
11: </script>
this.call这段代码中,第一个参数是arguments(‘伪’数组,是方法执行时传递的实参集合),如果某个函数使用.ex进行调用,函数内使用this将会指向参数集合(arguments),this.length则为实参的个数,this指向了调用时的实参集合(arguments)
有空要折腾一下算法和FP了…
- 无锁编程(六) - seqlock(顺序锁)
- 无锁编程(七) - 实战
- zookeeper的python客户端安装
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]
- 震撼:1分钟带你看完IC0的爆炸视频
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[下篇] (提供Source Code下载)
- bt、磁力怎么下载?老司机飙车终极思路……
- Linux进程间通信(五) - 信号灯(史上最全)及其经典应用案例
- 写出完美的snprintf
- 计算CPU利用率
- 详解Hadoop HA 如何运作
- Linux时间时区详解与常用时间函数
- 基于Linux整形时间的常用计算思路
- 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案[上篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 记一次FastJson漏洞的复现
- Flutter基础widgets教程-SizedOverflowBox篇
- 大量类加载器创建导致诡异FullGC
- 下载并安装Git
- 线程的六种状态转换
- 线程池的基本使用
- JavaScript闭包
- Js中Currying的应用
- Qt音视频开发37-USB摄像头解码ffmpeg方案
- Navicat 环境测试 innodb 的事务隔离级别 产生的幻读 和 不可重复读
- leetcode之最长回文串
- Discourse CentOS 8 全新安装手册
- 3分钟短文:Laravel路子真野啊!路由昵称前缀中间件
- CSS中重要的BFC概念
- Redis哨兵集群中哨兵挂了,主从库还能切换吗?