learn-js
learn-js copied to clipboard
老婆想学 js 这件事就是一个政治任务
第十天:递归
# 通常来说,提起递归,就会想到阶乘;想起阶乘就会想到自己既不喜欢数学也不喜欢历史;所以也就是说无论从客观层面(数学)上来说,还是从非客观(历史,通常更像故事而不是真实)都不喜欢,那就是任性;任性的结果是这些科目成绩不好,成绩不好就只能考法学院;考法学院还不好好学习,就只能写代码,写代码又要搞递归;递归又要回到阶乘。所以,还是贴个图片并从维基百科拿来一句定义吧:一个正整数的阶乘/层(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。  又要来逼死文科生了:递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。那我们用递归实现一个阶乘吧: ``` js function factorial(n) { return n ? (n * factorial(n - 1)) : 1; } ``` 好了,完美,不过《 JS 高级程序设计》里提及过一个问题,函数作为一个引用类型,在递归里,如果我们使用函数名来调用自身,可能会存在一个指向的问题(引用类型在有引用时,指向的对象是不会被回收(GC)的,对吧?!),看下面的代码: ``` js var f = factorial;...
现在,用 jQuery 的公司还很多,但是拿出来说的已经很少了。还有 15 分钟就要去跑步,加上老婆还在整天跟 jQuery 打交道,写两句说明一下。拿官方的例子说明一下: ``` js // 避免冲突,创建一个函数自执行函数,并把 `jQuery` 传入 (function( $ ) { // 用 `$.fn.插件名` 来定义一个新的插件 // 关于插件为什么不用 `new`,`$.fn` 是什么意思,可以看: // http://stackoverflow.com/questions/4083351/what-does-jquery-fn-mean $.fn.showLinkLocation = function()...
在处理字符串的时候,正则就非常有用。今天老婆又开始看文章了,所以我也开始更新了。举个例子,处理模板,在没有多行模板的时候,我通常会选择这样做: ``` js var person = { name: 'sofish', bio: 'a programmer'}; var tmpl = 'This is {name} and he is {bio}.'; var output = tmpl.replace(/\{(\w+)\}/g, function(match, group1) { return...
觉得 angular 2 的文档太难懂,想自己写,写到 template 渲染基本就挂,工作量太大,得出一个结果就是该作死一定会死,不想做死其实就写写 demo 或者有空就给人打打 patch 好了,自己写真的有点麻烦。不过在开始的时候写了一个简单的路由。实现一个基本功能,基本走向是: ``` php - constructor(): --> this.base = HTML_BASE || '/' --> this.routes = [], this.routes.notfound = --> this.current = ||...
[4 篇关于 Generator 的文章](https://davidwalsh.name/es6-generators),从入门到放弃(CSP),里面有几个重要的点: **1. 使用 `yield` 和 `return` 导致 `for...of` 结果的不同** ``` js function *foo() { yield 1; return 2; } var it = foo(); console.log( it.next() ); //...
呃,这其实是一个很大的话题,虽然说起来只有几句话。拿简单的十进制数字 `3`,如果转换成二进制: ``` js 3..toString(2) // '11' ``` 呃,浏览器里如何显示二进制呢?我们这里忽略,跳出来说一下为什么是 `3..toString()` 而不是 `3.toString()`,是不是也曾误了 `Number` 并没有 `toString` 方法?用 `..` 只是一个 hack 避开了小数点。另外可以写成 `(3).toString()` 这样就明白多了。转回来。关于如何把二进制转成 10 进制,就更简单了: ``` js parseInt('11', 2) // 3...
#### 一、避免无须有的实例化 一直很喜欢 Bootstrap 里用不 `new` 执行 js 的方式,写一个例子,阻止页面上任何 `a[preventdefault]` 标签的默认行为,并弹出它的链接: ``` js (function($) { $(document).on('click', 'a[preventdefault]', function(e) { e.preventDefault(); alert(this.href) }); })(jQuery); ``` 这种方式不需要像 `new PreventDefault('a[preventdefault]')`,在 html 中直接声明,比如 Tab...
依然是旧文,修改一波发出来。明天团队出去春游有可能没时间写: https://fe.ele.me/guan-yu-han-shu-zuo-yong-yu-he-ji-cheng/
突然想起 LeetCode,这是一个我不喜欢的地方,不过既然想去就去刷一刷。刷了几题觉得有时候就是很偏见的的玩意,比如奖字符串中的元音反转,也就是 `hello` 会变成 `holle`,也就玩玩。 准备结束刷新到 https://leetcode.com/problems/flatten-nested-list-iterator/ ,然后默默在编辑器写后运行,跑过自己本地的 Testcase,但是贴上去竟然出错。代码如下: ``` js var NestedIterator = function(nestedList) { this.nestedList = nestedList; }; NestedIterator.prototype.flatten = function(arr, ret) { if(!ret) ret = []; for(var...
> 最近有时差,昨天的任务今天来写 👎 。 昨天写了前天的任务「如何分组」。大家都会需要用到「洗牌」,而关于如何洗有多种算法,其中有一个简洁高效的算法就是 Fisher-Yates Shuffle https://bost.ocks.org/mike/shuffle/ ( 文章和演示都非常棒 )。 在「如何分组」里我写了一个思路,里面有一种重要的点是不断从原来的数组踢除数值,这会导致数组本身重排,而这是 Fisher-Yates 要避免的问题,他采用的是交换的方法来避免重排,如下中文注释。 ``` js function shuffle(array) { var m = array.length, t, i; // While there remain elements...