【JS】Day05

学习内容

  • 递归函数
  • 递归应用
  • 创建对象
  • 遍历对象
  • 数组
  • 数组的属性
  • 遍历数组
  • 值传递与引用传递

递归函数

自己调用自己的过程。
1. 本质:循环
2. 三要素:从哪里开始,到哪里结束、步长
建议在循环嵌套不确定层数时,使用递归函数。

// 下面这个代码就是一个最简单的递归函数
// 在函数内部调用了自己,函数一执行,就调用自己一次,在调用再执行,循环往复,没有止尽
function fn() {
  fn()
}
fn()

递归应用

//1 + 2 + 3 + …… + 100的和
function fnSum(n){ //n: 循环初值
    if(n === 0){ //循环条件
        return 0;
    }else{
        return n + fnSum(n - 1); //n - 1 : 步长
    }
}
alert(fnSum(5));

//n!
function fnFac(n){
    if(n === 1){
        return 1;
    }else{
        return n * fnFac(n - 1);
    }
}
alert(fnFac(5));

//斐波那契数列
//1  1  2  3  5   8   13   21   34    55
function fib(n){ //n: 代表第几个数
    if(n == 1 || n == 2){
        return 1;
    }else{
        return fib(n - 1) + fib(n - 2);
    }
}
//alert(fib(10));
var str = ''; //空串,放结果
//循环
for(var i = 1;i < 21;i ++){
    str += fib(i) + ' ';
}
document.write(str);

//输出10个Hello world
function fn(n){
    if(n === 0){
        return;
    }else{
        console.log('helloworld');
        return fn(n - 1);
    }
}
fn(50);

创建对象

// {key: value,key:value,key:value}
// () 函数   {}  对象  [] 数组
//字面量
var obj = {
    name: '张三',
    age : 18,
    sex : '女',
    address : '太原'
};  //对象

// obj.tel = 110;
// console.log(obj);

// var o1 = new Object();
// o1.name = '空调';
// o1.type = '移动空调';
// o1.price = 2999
// console.log(o1);

// console.log(obj.name);
console.log(obj['age']);

遍历对象

for(循环变量 in 对象){
  语句组;
}
//注:循环变量不能赋值!

//声明一个对象
//对象中的key 默认为String类型,如果是值是字符串时,必须添加引号
var obj = { id: 1,name: '手机',price: 5999,num: 2};

console.log(obj.id,obj.name,obj.price,obj.num);
console.log(obj['id'],obj['name'],obj['price'],obj['num']);

// console.log(obj);
// alert(obj);  //[object Object] 第一个表示类型,第二个表示名称
// alert(obj.name + '-' + obj.id + '-' + obj.price + '-' + obj.num);
//一次性全部单独取出每一个属性
//遍历对象
//1. for in 循环中的循环变量切记不能赋值。
//2. for in 中的参数是空格分隔
//3. for in循环中循环变量代表的是对象中的属性(key)
//4. 遍历对象时,只能使用for in

// 访问对象中的属性
// 1. 对象.属性
// 2. 对象[属性]
for(var key in obj){
    console.log(key,obj[key]);
}

数组

// //声明数组
// var arr = []; //空数组
// var arr1 = [1,2,3,4,5]; 
// console.log(arr,arr1);

// arr[0] = true; //数组中第一个空间中存储一个数据为true
// arr[1] = false;

// //声明数组
// var arr = new Array();
// var arr1 = new Array('a','b','c');
// console.log(arr,arr1);

//区别
//字面量声明,[]中的数据无论放什么,都表示数组元素。
var arr = [5]; //开辟了一个空间,存入了一个5
//构造函数方式声明
//1. 如果有一个正整数,则表示数组长度。
var list = new Array(5); //5 个空间,每个空间中的值是undefined
//2. 如果有一个负整数,则报错,长度不能为负数
// var list1 = new Array(-5); //
//3. 如果有一个小数,则报错,长度不能是小数
// var list2 = new Array(3.4); 

//4. 如果有多个整数或其它类型的数据时,都表示数组元素
var list3 = new Array('3');
var list4 = new Array(true);
var list5 = new Array(1,2);
console.log(list3,list4,list5);
// console.log(arr,list);

数组的属性

//声明一个数组
var arr = new Array(3);
//下标
arr[30] = 4;
console.log(arr[3]); //undefined
//属性 length: 表示数组的长度
console.log(arr.length,arr['length']);

遍历数组

//声明一个空数组
var arr = [];
//存入5个成绩
// arr[0] = 100;
// arr[1] = 99;
// arr[2] = 98;
// arr[3] = 10;
// arr[4] = 100;
//重复赋值
//循环:3
//遍历数组
// var i = 0;
// while(i < 5){
//     arr[i] = Number(prompt('请输入第' + (i + 1) + '个成绩:'));
//     i ++;
// }

//     var i = 0;
//    do{
//         arr[i] = Number(prompt('请输入第' + (i + 1) + '个成绩:'));
//         i ++;
//     } while(i < 5);
for(var i = 0;i < 5;i ++){
    arr[i] = Number(prompt('请输入第' + (i + 1) + '个成绩:'));
}
//求和
//遍历数组
var sum = 0; //放和的变量
// 每循环一次,就会获取一次长度,影响性能
// for(var i = 0;i < arr.length;i ++){
//     sum += arr[i];
// }

//优化程序
//无论循环多少次,只获取一次长度。
for(var i = 0,len = arr.length;i < len;i ++){
    sum += arr[i];
}
console.log('总成绩:' + sum);

//最高成绩
//变量
var max = arr[0]; //取数组中第一个成绩放到max中
for(var i = 0,len = arr.length;i < len;i ++){
    if(max < arr[i]){
        max = arr[i];
    }
}
console.log('最高成绩:' + max);
//最低成绩
var min = arr[0];
for(var i in arr){
    if(min > arr[i]){
        min = arr[i];
    }
}
console.log('最低成绩:' + min);

值传递与引用传递

堆和栈空间存储数据:
1. 基本数据类型的数据属于值传递
2. 复合数据类型的数据属于引用传递(地址传递)

//
var a = 3;
var b = a;
a = 4;
console.log(a,b); //4 3

var arr = [1,2];
var list = arr;
arr[0] = 8;
console.log(arr,list); //[8,2] [8,2]

var obj = {name: '张三'};
var object = obj;
obj.name = '李四';
console.log(obj,object); //{name:'李四'} {name:'李四'}

//
var arr = [1];

function fn(a){
    a[0] = 8;
}
fn(arr);

console.log(arr); //[8]

function fun(a){
    a = 88;
}
fun(arr[0]);
console.log(arr); //[8]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值