学习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)