二十三、算法练习
唐浩强c语言提出了一个公式:
编程=算法+数据结构
JS中的数据结构只有两个(不考虑ES6、7、8):数组、对象。
算法层面,你的工具:
1 | for if while if switch 函数 |
例1,计算n的阶加,1+2+3+……+n
1 | <script> |
例2,计算阶乘:
1 | function factorial(n){ |
例3:寻找喇叭花数
各个数位的阶乘和等于它本身
1 | <script> |
一些问题举例:
有一个重要题型,让你判断程序运行结果。
这种问题,一定是找“坑点”出:
1 | 变量声明提升的undefined的问题 |
例子1:
1 | <script> |
弹出undefined。
因为函数中的var定义的变量,能够自动提升声明到函数的最开始,所以遮蔽了外部的 a 。
例子2:
1 | <script> |
弹出 20
这是一个经典的闭包的例子。
什么是闭包:
函数能够记住自己定义时候所处的作用域,无论函数在哪里运行,都不会忘记最初的作用域。
例子3:
1 | <script> |
先弹出 undefined ,再弹出 5
if语句的真假性,不会影响变量声明的提升。
所以即使感觉 !a 是假,但是var a 提升是必然的。所以判断的是 !undefined , 能够进入if,给 a 赋值为 5 ,就弹出 5
例子4:
1 | <script> |
连续使用赋值运算符,会从右边忘左边进行赋值。
所以b = 2 a = 2 。但是b没有被var,作用域就溢出了,就是全局作用域,能弹出结果2 。 a 是被var的,出不来。
如果写成:
1 | var a = 1 , b = 2; |
中间用逗号隔开,说明a b 都被var了,都出不来。
即,等价于:
1 | var a = 1; |