1. 如何方便的用测试写代码
// 编写测试条件函数,参数为一个布尔值,和一个提示信息
const ensure = function(condition, message) {
//条件成立时,输出测试成功,条件失败,输出测试失败以及错误信息(message)
if(condition) {
log('测试成功')
} else {
log('测试失败, ', message)
}
}
#编写数组元素乘积函数
const product = function(array) {
var s = 1
var i = 0
while(i < array.length()) {
var n = array[i]
s = s * n
i = i + 1
}
}
#对product函数进行测试
const testProduct = function() {
var numbers = [1, 2, 3, 4]
var value = 24
ensure(value == product(numbers), '测试错误1')
ensure(1 == product([1), '测试错误2')
ensure(0 == product([1, 2, 3, 0]), '测试错误3')
}
PS:当对无限小数进行比较时,可以计算其差值,小于一个下限
2. 程序函数模块化
将函数模块化,并创建一个入口函数,这样可以避免函数对从上到下执行的依赖性(不正交)。只有一个入口,一个测试入口,会更加规范。
//编写main函数,整个程序外部只有函数和对象的定义(全局变量的使用??)
const main = function() {
//只是用一个入口进行函数的测试和运行
//testProduction()
...
...
}
main() //这是整个程序的唯一入口
PS:当在循环函数在使用continue时,注意条件语句的位置,防止出现死循环
3. 字典(map/dict)
map是一个重要的存储数据的数据类型,map通过key(键)来访问数据
//创建一个字典
var taoer = {
'name': 'gualang',
'age': 15, //最后一个元素可以不加逗号,但为了一致性,最好加上逗号
//程序中应该避免出现特例,造成不正交,避免错误的产生
}
字典的内容是成对出现的,由冒号分割开,左边的是key(键),几乎所有情况下,key都是字符串,定义时可以不加引号,但当有空格时,必须加引号
右边的是value值,可以是任意类型
实际上可以把array看作是 key 为数字的字典
字典的数据引用: taoer['name'] 或者是 taoer.name
4. 递归
一个函数调用本身或者两个函数相互调用,递归有适用的场景,不应该随便使用,以下为示例:
//使用递归求阶乘
const fac = function(n) {
//如果 n 是 0 则返回 1
//这是递归终止的条件,必须要有,否则会无限递归
if(n == 0) {
return 1
} else {
//如果 n 不为 0,返回 n * fac(n - 1)
//这时候 n 是已知的,fac(n - 1) 需要计算
//于是代码进入下一重世界开始计算
//return n * fac(n - 1), 直到为 0 时,返回 1,调用自身
var n1 = fac(n - 1)
return n * n1
}
}
例:使用递归计算斐波那契数列
//斐波那契数列的定义:fib(n) = fib(n - 1) + fib(n - 2)
//当n 等于 1,2 的时候,fib(n) 为 1
//1 1 2 3 5 8 13 21
const fib(n) {
//如果 n 小于 3,则返回 1 作为结束
//这是递归终止的条件,必须要有,否则无限递归
if(n < 3) {
return 1
} else {
//如果 n 不为 1 和 2,返回 fib(n - 2) + fib(n - 1)
//这时候 fib(n - 2) fib(n - 1) 需要计算
//于是代码进入下一重世界开始计算
var f1 = fib(n - 2)
var f2 = fib(n - 1)
return f1 + f2
}
}
网友评论