学习js的第五天【作用域,递归,对象,数组】

学习js的第五天【作用域,递归,对象,数组】


一.作用域

===>变量起作用的范围

1.局部作用域:在函数体中作用范围

2.全局作用域:在整个js全局起作用

var num=100 ----->全局作用域
function f(){
  var num1=200 ----->局部作用域
  }
console.log(num1) 输出的结果会报错,说num1是不被定义的
console.log(num)  正常输出100,num为全局作用域 

作用域的访问规则:作用域的查找机制只能向上找,不能向下找

层层查找的关系,叫作用域链

1.会在当前作用域找访问变量

2.如果当前作用域没找到,到上级作用域去找

3.如果上级作用域没有,接着向上找,直到全局作用域

4.如果全局作用域也没有,直接报错.

赋值规则:

1.赋值前在当前作用域查找

2.上级作用域查找,找到赋值

3.上级作用域查找,直到全局作用域

4.如果都没有找到,将创建全局变量,然后赋值

 内层函数可以访问外层函数作用域变量

外层不能访问内层作用域变量

二、递归函数

1.定义:函数自身调用自身,这样的函数称为递归函数(一定要有结束递归的条件)

function fun(){
  console.log('fun')
  fun()
} -------->没有结束递归的条件就会形成死递归

有结束递归的条件

function fun(n){
  if(n==1){ ------------>递归结束的条件
   return 1
}
console.log('fun')
fun(--)  ------------>改变递归条件的代码
}
fun(2)

注意:递归结束的条件

         改变递归条件的代码

2.递归的作用:

解决哪些问题:

1>后面的结果由前面的推导出来,可以采用递归简化代码

求1+2+3+4+.....+100前三项的和
function f(n){
 if(n==1){
  return1
}
return f(n-1)+n
}
var sum=f(3)

列题:

  <!-- 递归-斐波那契 1, 1, 2, 3, 5, 8, 13 ...   前两项都是 1, 后面项等于前两项之和    -->
    <script>
        function f(n){
            if(n<=2){
                return 1
            }
            return f(n-2)+f(n-1)
        }
        var m=f(7)
        console.log('第四项的值:'+m)
    </script>



   <!-- 求1*2*3*4........前n项的乘积
      分析:f(1)=1
            f(2)=f(1)*2
            f(3)=f(2)*3 ======>f(n)=f(n-1)n -->
<script>
    function f(n){
        if(n==1){
            return 1
        }
        return f(n-1)*n
    }
    var m=f(3)
    console.log('前三项的乘积:'+m)
</script>


 <!-- 求1+2+3+4+.....前三项的和 -->
    <!-- 分析:f(1)=1
         f(2)=f(1)+2
         f(3)=f(2)+3====》f(n)=f(n-1)+n -->
    <script>
        function f(n){
            if(n==1){
                return 1
            }
            return f(n-1)+n
        }
        var m1=f(5)
        console.log('前三项的和:'+m1)
    </script>

三.对象

1.对象==》object

   属性        方法

2.创建对象:

var jackobj(对象名)={}  -------》创建空对象

var jackobj={

                        name:jack, --------->表示对象的一个特征,属性

                       age:18}

1.创建
var obj{
         name:'jack',
         age:18,
         sex:'男'
       }
2.访问:对象名.属性名
console.log(obj.name)
3.修改属性值:对象名.属性名='要修改的名字'
obj.name='rose'
4.删除属性:delete 对象名.属性名
delete obj.name
5.添加属性:对象名.要添加的属性名=属性值
obj.height=180
6.遍历对象属性:for-in
for(var key in obj){  ------->可以遍历整个对象的所有属性名和属性值
console.log(key)}
7.访问属性值,属性名是变量的情况:
var _name='name'
console.log(obj.[_name])

示例:

 <!-- 创建一个名为student的学生对象,有属性学号num,性别sex,班级grade, 成绩score, 姓名name
    分别用字面量方式和构造函数方式创建.
    要求打印显示学生信息到页面 -->
        var studentobj={
            name:'acy',
            sex:'女',
            grade:'三年二班',
            score:'优秀',
            num:'11009998'
        }
        // 遍历对象属性
        for(var key in studentobj){
            console.log('key'+ ' ' +key+ ' ' +'value'+' '+studentobj[key])
        }
        // 通过对象名访问对象属性:【对象名.属性名】
        console.log('姓名'+studentobj.name)
        // 修改属性值:【对象名.属性名='要修改的名字'】
        studentobj.name='ljm'
        console.log(studentobj.name)
        // 删除属性 【delete 对象名.属性名】
        delete studentobj.num
        for(var key in studentobj){
            console.log('key'+' '+key+'value'+' '+studentobj[key])
        }
        // 添加属性 【对象名.要添加的属性名=要添加的属性值】
        studentobj.height=180
        console.log('身高'+studentobj.height)
        for(var key in studentobj){
            console.log('key'+' '+key+'value'+' '+studentobj[key])
        }
        // 访问属性值,属性名是变量的情况
        var _name='name'
        console.log(studentobj[_name])

3.数据类型:

var num=100 ------->number类型

var name='jack' ------->string类型

var obj={name:'jack',age='18'} --------->复杂数据类型

obj   数据类型名--------->  object

4.创建对象new语句:

字面量方式:var obj={}

构造函数方式:

var obj=new object()

obj.name='jack',

obj.age=18 

四.数组 Array

1.数组的作用:存储一系列有序数据的集合

2.创建数组:

var arr=[1,2,'jack',true]

3.索引号(下标)

4.访问数组元素

console.log(arr[0])

5.数组长度 (元素个数):length属性

console.log(arr.length) ------->可以拿到数组的长度

6.遍历数组:for -------->循环变量表示数组索引号从0开始

for(var i=0;i<arr.length;i++){

console.log(arr[i])}

7.构造函数方式创建数组:

var arr = new Array() ------->构造函数方式

列:var arr=new Array(10,9,8)

字面量:var arr=[]-------->空数组

8.创建数组时只有一个元素,表示创建一个空数组长度为5

var arr=new Array(5)

9.直接控制台打印

console.log(arr)

示例:

 <!-- 现有5名学生,语文成绩分别是98,87,95,89,77分,请定义一个成绩数组存储学生成绩并遍历输出
    求5名学生总成绩?
    求大于平均分的学生成绩?
    有一个存储两个数的数组[3,6]写程序交换数组元素,输出[6,3] -->
        var scoreArr=[98,87,95,89,77]
        for(var i=0;i<scoreArr.length;i++){
            console.log(scoreArr[i])
        }
        var sum=0
        for(var i=0;i<scoreArr.length;i++){
            sum=sum+scoreArr[i]
        }
        console.log('总成绩:'+sum)
        var sum=0
        var average
        for(var i=0;i<scoreArr.length;i++){
            sum=sum+scoreArr[i]
            average=sum/scoreArr.length
            if(scoreArr[i]>average){
                console.log('大于平均分:'+scoreArr[i])
            }
        }
        console.log('平均分:'+average)
    </script>
    <!-- 有一个存储两个数的数组[3,6]写程序交换数组元素,输出[6,3] -->
    <script>
        var arr=[3,6]
        // console.log(arr)
        var temp=arr[0]
        arr[0]=arr[1]
        arr[1]=temp
        console.log(arr)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值