JavaScript-day04

23 阅读5分钟

一、自定义函数

函数就是需要先定义好,以后可以反复使用的一个代码段

1.1 何时使用

不希望打开页面立即执行,以后可以反复使用,希望用户来触发

1.2 如何使用

  • 创建:2种方式
  1. 声明方式:
function 函数名(形参列表) {
    操作
    return 返回值/结果
}
  1. 直接量方式:
var 函数名 = function(形参列表) {
    操作
    return 返回值/结果
}
  • 调用
函数名()
1. var 接住返回的结果 = 函数名(实参列表)
2. 其实return的本意是退出函数,但是如果return后面跟着一个数据,顺便将数据返回到函数作用域的外部,但是return只负责返回,不负责保存,所以调用函数时要自己拿个变量来接住他
3. 就算省略return,默认也有,会return一个undefined
4. 具体需不需要得到函数的结果,看你自己:如果有一天你在全局希望拿着函数的结果去做别的操作,那么记得加return
5. 前辈们提供给你的方法,大部分基本上都加了return

1.3 作用域:

  • 全局作用域:
    • 全局变量 和 全局函数,在页面的任何一个位置都可以使用。
  • 函数作用域:
    • 局部变量 和 局部函数,在【当前函数调用时,内部可用】
  • 使用规则
    • 优先使用局部的,局部没有找全局要,全局也没有那就会报错
  • 局部可以使用全局的,但是全局不能使用局部的 - 解决:return

1.4 全局污染:

函数中对着未声明的变量直接赋值会造成全局污染:全局本身没有这个东西,但是被函数作用域给添加上了

1.5 声明提前:

在程序正式执行之前,将var声明的变量(轻)和function声明的函数(重),都会悄悄的集中定义在当前作用域的顶部,但是赋值留在原地
  1. 提升var在function之前
  2. 声明方式创建的函数会完整的提前
  3. 直接量方式创建的函数不会完整提前,只有变量名部分会提前

1.6 重载:

相同的函数名,根据传入的实参的不同,自动选择对应的函数去执行,但是JS不支持,函数名如果重复了,后面的肯定会覆盖掉前面的
  • 目的: 减轻我们程序员的压力,记住一个方法就可以执行很多的操作
  • 解决:在【函数内部】自带一个arguments的对象(类似数组对象):不需要我们去创建 - 哪怕没有写任何形参,他也可以接受住所有实参,所以默认你看他length长度为0
  1. 通过下标去获取传入的某一个实参:arguments[i] - i从0开始
  2. 通过length去获取到底传入了几个实参:arguments.length
  3. 通过判断传入的实参的不同,在内部去写判断,从而变相的实现重载

二、数组的基础

数组:创建一个变量可以保存【多个数据】
数组都是线性排列,除了第一个元素,每个元素都有唯一的前驱元素
除了最后一个元素,每个元素都有唯一的后继元素
每个元素都有一个自己的位置,称之为叫做下标,下标都是从0开始的,到最大长度-1结束

2.1 创建数组:

  • 直接量方式:
var arr=[];//空数组
var arr=[数据1,...];
  • 构造函数方式:
var arr=new Array();//空数组
var arr=new Array(数据1,...);

2.2 获取数组之中的元素:

数组名[i]

2.3 后续添加/替换元素:

数组名[i]=新数据;
如果下标处没人则为添加,如果下标处有人则为替换

2.4 数组具有三大不限制

  • 不限制元素的类型
  • 不限制元素的长度
  • 不限制下标越界
    1. 如果获取元素时,下标越界,返回的是一个undefined
    2. 如果添加元素时,下标越界,会得到一个稀疏数组,如果我们搭配上我们学过循环去遍历获取每个元素,那么你会得到很多很多undefined

2.5 数组中有一个唯一的属性:length

  • 语法:数组名.length
  • 作用:获取到数组的长度,长度是从1开始的
  • 向末尾添加元素:arr[arr.length]=新数据;
  • 获取数组的倒数第n个元素:arr[arr.length-n];
  • 缩容:删除倒数n个元素:arr.length-=n;

2.6 遍历数组:

往往很多情况,我们不会拿出某个元素来使用,而是拿出每个元素来进行 相同 或 相似的操作 - 搭配上循环
  • 固定公式
for(var i=0;i<arr.length;i++){
    arr[i];//当前次元素
}

三、案例

// 创建一个方法 传入一个实参的时候求平方 传入两个实参的时候求和
function fn() {
    /* if(arguments.length == 1) {
        return arguments[0]*arguments[0]
    } else if(arguments.length == 2) {
        return arguments[0] + arguments[1]
    } */
    switch(arguments.length) {
        case 1:
            return arguments[0]*arguments[0]
            break
        case 2:
            return arguments[0] + arguments[1]
            break
    }
}
console.log(fn(2));
console.log(fn(3,3));
// 准备一个数组 获取最大值 
var arr = [1,52,566,56,2,33,526,65,,2,5,88,888]
var max = arr[0]//声明一个最大值变量 假设数组第一个数字为最大值
// 遍历数组
for(var i = 0; i < arr.length; i++) {
    // 把数组中的每一位和max比较   如果数组中的数字大于max  就把这个数字赋值给max
    if(arr[i] > max) {
        max = arr[i]
    }
}
console.log(max);
// 准备一个数组 让用户输入一个字 看看数组里面有没有这个字 有就返回下标 没有返回-1
var arr = ['今','天','星','期','四']
var user = prompt("请输入一个字:目前有"+arr)
var index = -1
for(var i = 0; i < arr.length; i++) {
    if(user == arr[i]) {
        index = i
    }
}
if(index == -1) {
    alert("没找到!")
} else {
    alert("找到了,下标为:"+index)
}
//去重1:用户输入到重复的了,就去掉 
/* var arr = ["今","天","星","期","四"]
var user = prompt("请输入数字,目前有:"+arr)
index = -1
for(var i = 0; i < arr.length; i++) {
    if(user == arr[i]) {
        index = i
    }
}
if(index == -1) {
    alert("没找到")
}else{
    for(var i = index; i < arr.length; i++) {
        arr[i] = arr[i+1]
    }
    arr.length--
    console.log(arr);
} */

//去重2:数组里面已经有很多很多重复的了
var arr = [1,2,1,55,6,2,1,2,3,6,55,9,9,8,7,55]
for(var i = 0; i < arr.length; i++) {
    for(var j = i + 1; j < arr.length; j++) {
        if(arr[j] == arr[i]) {
            for(var k = j; k < arr.length; k++) {
                arr[k] = arr[k+1]
            }
            arr.length--
            j--
        }
    }
}
console.log(arr);
// 准备一个数组,录入员工名称,不断地录入,直到用户输入了exit才停止,在控制台输出看看录入哪些人
var arr = []
while(1) {
    var user = prompt("请输入员工姓名:")
    if(user == "exit") {break}
    arr[arr.length] = user
}
console.log(arr);