JavaScript二维数组与函数

时间:2025-05-09 07:25:21

目录

一、二维数组

1.创建方式

2.访问二维数组元素

3.练习

(1)求3*4的二维数组的每行元素之和

(2)求3*4的二维数组的每列元素之和

(3)求3*3的二维数组的对角线元素之和

4.二维数组的转置

二、函数

1.函数

2.定义

 3.调用

4.函数分类

(1)根据有无返回值分

(2)根据函数有无参数分

 练习:

(1)定义函数计算m~n的数据之和

(2)定义一个函数判断一个数是否是素数。输出100以内的所有素数

(3)定义一个函数判断其是否是'水仙花'数.输出1000以内的所有'水仙花'数

5.函数表达式

6.回调函数

7.函数的递归调用

(1)用递归解决问题的前提条件

(2)递归的过程

8、递归调用示例

(1)定义递归函数:输出斐波拉契数列的前20项

(2)用递归函数计算1+2+3+...+100的值

(3)定义递归函数打印一个整数的每一位数字

三、作用域的分类

1.作用域:作用范围

2.全局变量

3.局部变量

4.块级变量

5.作用域链

六、闭包函数

1.作用

七、立即调用的函数表达式

1.格式

2.练习题

定义函数,计算如下数列的前20项之和:2/1、3/2、5/3、8/5...


一、二维数组

通过两个下标(索引)来确定一个元素

1.创建方式

(1)使用new Array()创建

(2)通过'[]'创建

2.访问二维数组元素

数组名[下标1][下标2]

默认:按行优先,'下标1'是行下标,'下标2'是列下标

3.练习

(1)求3*4的二维数组的每行元素之和

        var arr=[
            [12,25,4,59],
            [11,33,41,26],
            [22,87,5,17]
        ]
        (arr)

        for(var i=0;i<;i++){
            var sum = 0
            for(var j=0;j<arr[i].length;j++){
                sum += arr[i][j]
            }
            ('第'+(i+1)+'行元素之和='+sum)
        }

(2)求3*4的二维数组的每列元素之和

        var arr=[
            [12,25,4,59],
            [11,33,41,26],
            [22,87,5,17]
        ]
        (arr)

        for(var i=0;i<arr[0].length;i++){//外循环:表示列下标
            var sum = 0
            for(var j=0;j<;j++){//内循环:表示行下标
                sum += arr[j][i]
            }
            ('第'+(i+1)+'列元素之和='+sum)
        } 

(3)求3*3的二维数组的对角线元素之和

        var arr=[
            [1,2,3],
            [4,5,6],
            [7,8,9]
        ]
        var s1=0,s2=0
        for(var i=0;i<;i++){
            s1 += arr[i][i];
            s2 += arr[i][-i-1]
        }
        ('左上-右下对角线元素和=',s1)
        ('左下-右上对角线元素和=',s2)

4.二维数组的转置

        var arr = [
            ['a','b','c',1],
            ['d','e','f',2],
            ['g','h','i',3],
            ['j','k','l',4]
        ]
        var res = []
        for(var i=0;i<;i++){//外循环:i是arr的列下标,也是res的行下标
            res[i] = []
            for(var j=0;j<;j++){//内循环:j是arr的行下标,也是res的列下标
                res[i][j] = arr[j][i]
            }
        }
        (res)

二、函数

1.函数

可以实现某种功能的程序代码块(重复使用)

2.定义

  function 函数名([参数])
   {
      函数体语句
   }

(1)function是关键字

(2)'函数名'是标识符,要符合JavaScript的标识符的定义规则

(3)'参数':函数可以有参数也可以没有参数。无论函数是否有参数,函数名后的圆括号不能省略

(4)'{}':表示函数的作用范围,不能省略

function getSum(){
     var sum = 0
     for(var i=1;i<=100;i++){
         sum +=i
     }
     return sum
  }

 3.调用

函数名([参数])  

4.函数分类

(1)根据有无返回值分

A、有返回值函数

在函数中含有 return 语句。通常使用完成某种运算,并将运算结果返回

强调:return作用

a:返回值一个值

b:从当前函数中退出

B、无返回值函数

在函数中没有return语句。通常函数只是实现某种功能,无需返回任何值

(2)根据函数有无参数分

A、有参函数

表示函数在实现某种运算或实现某种功能时,需要外部参数的参入

function showArray(arr){ //arr是形参,没有实际值,只是占位符
    var str = ''
    for(var i=0;i<;i++){
        for(var j=0;j<arr[i].length;j++){
            str += arr[i][j] + '\t'
            }
        str += "\n"
    }
    (str)
}

showArray(info) //函数的调用:info是实参,有实际的值

   实参将数据传递给形参,传递方向是单向的,即若形参发生了改变不会影响实参

   

 练习:

(1)定义函数计算m~n的数据之和

function getSum(m, n) {
    var sum = 0
    for (var i = m; i <= n; i++) {
        sum = sum + i
        }
    return sum
}
("1+2+3...+100=", getSum(1, 100))
('10+11+12+...+50', getSum(10, 50))

(2)定义一个函数判断一个数是否是素数。输出100以内的所有素数

function sushu(n) {
    for (var i = 2; i < n; i++) {
        if (n % i === 0) {
        break;
        }
    }
    if (i >= n) {
        return n
        }
}

for (var k = 1; k <= 100; k++) {
    if (sushu(k)) {
        (k)
        }
} 

(3)定义一个函数判断其是否是'水仙花'数.输出1000以内的所有'水仙花'数

function shuixian(n) {
    var n, a, b, c
    a = parseInt(n / 100);
    b = parseInt((n - 100 * a) / 10);
    c = parseInt(n % 10);
    if (n == a * a * a + b * b * b + c * c * c) {
        return n
    }
}

for (var i = 100; i < 1000; i++) {
    if (shuixian(i)) {
        (i)
    }
} 

函数就是程序模块,建议函数的功能尽量单一化

耦合:模块之间结合的紧密程度

内聚:模块内部结合的紧密程度

在项目中模块之间应该是高内聚、低耦合

关于函数的参数:形参和实参的个数可以不同

当实参数量多于形参数量时,函数正常执行,多余的实参会被忽略

B、当实参数量小于形参数量时,多出来的形参类似于一个已声明未赋值的变量,

   其值为undefined

C、arguments的使用

在定义函数时,每个函数都有一个隐含的内置对象arguments

在该对象中保存了函数调用时传递的所有实参

ps:

利用函数求任意数组中的最大值

利用return提前终止函数

利用return返回数组

利用函数对反转数组元素

5.函数表达式

将声明的函数赋给一个变量,通过变量完成函数的调用和参数传递

var 变量名=function([参数]){
     函数体语句
 }

6.回调函数

指的就是一个函数A作为参数传递给一个函数B,然后在B的函数体内调用函数A。此时,称函数A为回调函数。

function cal(num1,num2,fn){//fn是函数
    return fn(num1,num2)//调用fn函数,num1、num2作为参数
} 

function add(a,b){
    return a+b
}

var t=cal(12,25,function(a,b){
    return a+b
})
(t) 

7.函数的递归调用

函数自己调用自己

function fun(n){//用于计算n!
    if(n===1 || n ===0){//递归的结束条件
        return 1
    }else{
        return n*fun(n-1)//函数自己调用自己
    }
}

(fun(5))

(1)用递归解决问题的前提条件

A、问题可以分解:即可以将复杂问题分解成相对简单的问题

B、分解后得到一个新问题,新问题的解法与原问题的解法相同

C、分解问题时必须有明确的结束条件

(2)递归的过程

第一步:自上而下分解问题

第二步:自下而上回溯得到问题的解

8、递归调用示例

(1)定义递归函数:输出斐波拉契数列的前20项

1 1 2 3 5 8 13 21...

A、第一项、第二项都是1

B、从第三项开始,每项的值等于前两项之和

function fib(n){
    if(n===1 || n===2){
        return 1
    }else{
        return fib(n-1)+fib(n-2)
    }
}
var str = ''
for(var i=1;i<=20;i++){
    str += fib(i)+'\t'
}
(str)

(2)用递归函数计算1+2+3+...+100的值

function sum(n){
    if(n===1){
        return 1
    }else{
        return n+sum(n-1)
    }
}
var s
var i = 100
    s = sum(i)
(s)

(3)定义递归函数打印一个整数的每一位数字

function num(n) {
    if (n > 9) {
        num(parseInt(n / 10))
    }
    (parseInt(n % 10))
}
num(1024)

三、作用域的分类

1.作用域:作用范围

2.全局变量

var sum = 0//全局变量:在函数外部定义,是显示定义,在整个程序中都起作用
function getSum(n){
    sum = 0//全局变量:在函数内部没有使用var声明的变量,属于隐式定义
    for(var i=1;i<=n;i++){
        sum += i
    }
}
//var sum = 1//全局变量:会把sum的作用域进行提升
getSum(100)
(sum)//在函数外部访问sum,因为sum是全局变量

(1)在函数外部定义的变量

(2)在函数内部省略var关键字,声明的变量

3.局部变量

在函数内部使用var关键字声明的变量。只在函数内部有效

4.块级变量

在ES6(ECMAScript6)标准中提出的。是用户let声明的变量,只在语句块({})中有效

5.作用域链

当在一个函数内部声明另一个函数时,内层函数只能在外层函数作用域内执行,在内层函数执行的过程中,若需要引入某个变量,首先会在当前作用域中寻找,若未找到,则继续向上一层级的作用域中寻找,直到全局作用域,称这种链式的查询关系为作用域链。  

var s = 0
function text(){
    var t = 1
    var fun = function(){
        t++
        s += t
    }
    fun()
}
text()
(s)

六、闭包函数

简称"闭包",指的是有权访问另一个函数作用域内的变量(局部变量)的函数

function fn(){
    var times = 0//局部变量:作用域为fn函数
    var c = function(){//函数表达式:是一个闭包函数,在他的内部访问了fn函数的局部变量times
        return ++times
    }
    return c//返回的是闭包函数
}
var count = fn()//函数表达式
('第一次调用',count())
('第二次调用',count())
('第三次调用',count())
('第四次调用',count())

1.作用

(1)可以在函数外部读取函数内部的变量(局部变量)

(2)可以让函数内部局部变量的值始终保存在内存中

2、闭包的优缺点、闭包中作用域链的体现

七、立即调用的函数表达式

即立即调用匿名函数。

1.格式

(function([参数]){ //匿名函数

    函数体语句

 })(); //立即调用
(function(){
    var sum = 0
    for(let i=1;i<=100;i++){
        sum += i
    }
    ('1+2+3+...+100=',sum)
})()
 */

2.练习题

定义函数,计算如下数列的前20项之和:2/1、3/2、5/3、8/5...

(function(){
    var sum = 0
    var a = 1
    var b = 2
    for(var i=1;i<=20;i++){
        sum = sum + b/a
        temp = b
        b = a + b
        a = temp
    }
    (sum)
})()