js基础—函数和对象的详细知识点

154 阅读4分钟

js基础-函数+对象

函数

一、函数的作用

函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。

二、函数的使用

2.1函数的声明与调用

//函数的声明语法
function 函数名(){
    函数体
}

/*===============*/
function getName() {
            document.write('小李子')          
        }
//函数调用
        getName()

2.2函数的命名规范

  • 和变量命名基本一致
  • 尽量小驼峰式命名法
  • 前缀应该为动词
  • 命名建议:常用动词约定
动词含义
can判断是否可执行某个动作
has判断是否含义某个值
is判断是否为某个值
get获取某个值
set设置某个值
load加载某些数据

三、函数传参

参数列表

  • 传入数据列表

  • 声明这个函数需要传入几个数据

  • 多个数据用逗号隔开

//声明语法
function 函数名 (参数1,参2,....)

//例
function calsSum(num1,num2){
            console.log(num1+num2)
        }
        calsSum(200,100)

四、函数返回值

当调用某个函数,这个函数会返回一个结果出来,这就是有返回值的函数,需要根据需求设定

4.1 return返回值

当函数需要返回数据出去时,用return关键字

//语法
return 数据

/*===================*/
function getmax(num1,num2){
            if(num1>num2){
                return num1
            }
            else{
                return num2
            }  
        }

        let A=getmax(100,150)
        console.log(A)
        
        let b=getmax(500,150)
        alert(b)
        
        let c=getmax(300,150)
        document.write(c)

注意:

  1. 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
  2. 函数内部只能运行到 1 次 return,并且 return 后面代码不会再被执行,所以 return 后面的数据不要换行写
  3. return会立即结束当前函数
  4. 函数可以没有 return,这种情况函数默认返回值为 undefined

五、作用域

5.1作用域的概述

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

作用域分为全局作用域、局部作用域两类

  • 全局作用域:作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件;
  • 局部作用域:作用于函数内的代码环境或作用于由 { } 包括,if语句和for语句里面的{ }等 ,就是局部作用域。
  • ​ 变量访问原则-----作用域链,就近原则(根据函数的声明定义来逐级就近判断)
<script>
      // script标签内的运行环境就是全局作用域
      let num = 100; // 全局作用域

      function getMax() {
        // 这个区域内就不属于全局作用域
        // 局部作用域 或者 也叫做 函数作用域
        let num2 = 200;
      }

      for (let index = 0; index < 4; index++) {
        // 块级作用域
      }

      while (true) {
        // 块级作用域
      }
      if (true) {
        // 块级作用域
      }
    </script>
  • 如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐
  • 函数内部的形参可以看做是局部变量,所以形参相当于函数内部定义的局部变量,只有在函数内部可以使用。

六.匿名函数

 <script>
      // 函数按照有没有名字 分成两种
      // 有名字 具名函数
      // 没有名字 匿名函数

      // 具名函数  函数名称  func1
      // function func1() {
      // }

      // 匿名函数  = function () {}; 匿名函数 了解即可 

      //    let func2 = function () {};  叫做 函数表达式 
      // 表达式 可以表示结果的一段代码  函数表达式  了解 
      let func2 = function () {
        console.log("123");
      };


      // 调用
      func2();
    </script>

七、自启动函数

 <script>
      /* 
      自执行函数 =  匿名函数一起出现  通用的功能是   防止变量污染 
      函数在定义的同时 直接就执行了 

      用在哪里呢  
      适合做一次性的任务- 不希望这个函数可以得到复用!!! 
        函数包装多段代码  让程序比较简洁

      1 页面打开时候
        1 设置 页面的标题 =  月薪过万
        2 设置 页面的背景颜色 =  黄色 
      
       */
      // 匿名函数
      // function () {
      //   // 设置 页面的标题 =  月薪过万
      //   document.title = '月薪过万';
      //   // 设置 页面的背景颜色 =  黄色
      //   document.body.style.backgroundColor = 'yellow';
      // }

      // let msg = 123;
      // // 自执行函数
      // (function () {
      //   let msg = 123;
      //   // 设置 页面的标题 =  月薪过万
      //   document.title = '月薪过万';
      //   // 设置 页面的背景颜色 =  黄色
      //   document.body.style.backgroundColor = 'yellow';
      // })();

      // console.log(msg);
    </script>

对象

一、什么事对象

对象(object)是JavaScript里的一种数据类型,是一种无序的数据集合。

二、对象的使用

1.对象的声明

 let 属性名 = {
            属性名:属性值,
            方法名:函数
        }

2.对象的属性

 let person = {
            uname: 'pipi',
            age:18,
            sex: '女',
        }

3.属性的访问

   <script>
        let goods = {
            name: '小米11',
            price: '3299元',
            size: '大',
        }
        //方法一 对象名.属性名
        console.log(goods.name);
        console.log(goods.price);
        console.log(goods.size);

        //方法二 对象名["属性名"]  需要加引号
        console.log(goods["name"]); 
        console.log(goods["price"]);
        console.log(goods["size"]);

        document.write(`名称:${goods.name},价格:${goods.price},型号:${goods.size}`)
    </script>

4.对象中的方法及访问

  <script>
        let person = {
            name: 'liya',
            sayHi:function (msg){
                document.write(msg);
            }
        }
        person.sayHi('你好<br>')
    </script>

5.对象的增删改

    <script>
        let person = {
            userName: 'liya',
            height: 180,
        }
        person.userName = 'pipi'; //修改
        person.age = 18;  //新增
        delete person.height; //删除
        console.log(person);
        //新增
        person.sayHi = function(){
            document.write('新增的函数');
        }
        person.sayHi()
    </script>

6.对象的遍历

   <script>
        let person = {
            userName: 'liya',
            age: 18,
            height:180,
        }

        for (let k in person) {
           console.log(k);//打印属性名
           console.log(person[k]); //打印属性值
           console.log(`属性名${k}  属性值${person[k]}`)
        }
    </script>

记住:k是获得对象的属性名,属性名[k]是获得属性值

案例:

let students = [

{name: '小明', age: 18, gender: '男', hometown: '河北省'},

{name: '小红', age: 19, gender: '女', hometown: '河南省'},

{name: '小刚', age: 17, gender: '男', hometown: '山西省'},

{name: '小丽', age: 18, gender: '女', hometown: '山东省'}

]

需求:根据以上数据渲染生成表格 1648912663365.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        table{
            width: 600px;
            margin: 50px auto;
            border-collapse: collapse;
            text-align: center
        }
        caption{
            font-weight: 700;
        }
        thead{
            background-color: #f6f6f6;
        }
        td{
            height: 30px;
        }
    </style>
</head>
<body>
    <script>
        let students = [
          { name: '小明', age: 18, gender: '男', hometown: '河北省'},
          { name: '小红', age: 19, gender: '女', hometown: '河南省' },
          { name: '小刚', age: 17, gender: '男', hometown: '山西省' },
          { name: '小丽', age: 18, gender: '女', hometown: '山东省' }
        ]
  
        let htmlTable = `<table border="1">
                        <caption>
                          学生列表
                        </caption>
                        <thead>
                          <tr>
                            <th>编号</th>
                            <th>姓名</th>
                            <th>年龄</th>
                            <th>性别</th>
                            <th>家乡</th>
                          </tr>
                        </thead>
                        <tbody>`
        // 遍历数组,获取其中的每一个对象
        for (let i = 0; i < students.length; i++) {
          htmlTable += `<tr>
                        <td>${i + 1}</td>`
        //遍历对象,获取每一个元素
              for (let k in students[i]) {  
                htmlTable += `<td>${students[i][k]}</td>`   
                  }
          htmlTable += `</tr>`     
              }  
        htmlTable += `</tbody>
                </table>`
  
        document.write(htmlTable)
      </script>
</body>
</html>

三、内置对象

1.什么是内置对象

JavaScript内部提供的对象,包含各种属性和方法给开发者调用,如使用过的document.write();console.log()。

2.内置对象Math

Math对象是JavaScript提供的一个“数学高手”对象

功能:

  • random:生成0-1之间的随机数(包含0不包括1)
  • ceil:向上取整
  • floor:向下取整
  • max:找最大数
  • min:找最小数
  • pow:幂运算
  • abs:绝对值
  • round:四舍五入
 <script>
        console.log(Math.random()) //随机值
        
        console.log(Math.ceil(0.2)) //向上取整
        
        console.log(Math.floor(0.2)) //向下取整

        console.log(Math.max(0,2,23,76,8,9)) //最大值

        console.log(Math.min(1,2,67,87)) //最小值

        console.log(Math.pow(2,3)) //幂运算 2的三次方

        console.log(Math.abs(-3)) //绝对值

        console.log(Math.round(0.6)) //四舍五入
    </script>

3.练习

练习1.生成0-10的随机数

<script>
console.log(Math.round(Math.random()*10)) //0-10取随机数
</script>

练习2:生成5-10的随机数

<script>
console.log(Math.round(Math.random()*5+5)) //5-10取随机数
</script>

练习3:生成N-M的随机数

<script>
console.log(Math.round(Math.random()*(M-N)+N)) //N-M取随机数
</script>

根据以上三个练习可以写出一个求随机数的函数

<script>
 function getRandom(min,max){
            return Math.round(Math.random()*(max-min)+min);
        }
        console.log(getRandom(0,10)); //0-10取随机数
        console.log(getRandom(5,10)); //5-10取随机数
</script>

4.案例

案例1:随机点名系统

需求:请把 [‘赵云’, ‘黄忠’, ‘关羽’, ‘张飞’, ‘马超’, ‘刘备’, ‘曹操’] 随机显示一个名字到页面中

分析:

①:利用随机函数随机生成一个数字作为索引号

②: 数组[随机数] 生成到页面中

<script>
        let arr = ['赵云', '关羽', '张飞', '黄忠', '马超', '刘备', '曹操'];
        document.write(arr[Math.round(Math.random()*arr.length-1)]);
    </script>
案例2:随机点名系统改进

需求:请把 [‘赵云’, ‘黄忠’, ‘关羽’, ‘张飞’, ‘马超’, ‘刘备’, ‘曹操’] 随机显示一个名字到页面中,但是不允许重复显示

分析:

①:利用随机函数随机生成一个数字作为索引号

②:数组[随机数] 生成到页面中

③:数组中删除刚才抽中的索引号

  <script>
        let arr = ['赵云', '关羽', '张飞', '黄忠', '马超', '刘备', '曹操'];
        function getRandom(min,max){
            return Math.round(Math.random()*(max-min)+min);
        }
        
        for(let i = 0; i < 7; i++){
        let index = getRandom(0,arr.length-1)
        document.write(arr[index]);
        arr.splice(index,1)       
        }
    </script>
案例3:猜数字游戏

需求:程序随机生成 1~10 之间的一个数字,用户输入一个数字

分析:

①:利用随机数生成一个数字

②:需要一直猜,所以需要不断的循环

③:因为条件是结果猜对了,就是判断条件退出,用while循环合适

④:内部判断可以用多分支语句

    <script>
        let num1 = Math.round(Math.random()*9+1);
        
        //设置一个死循环
        while(true){
            let num2 = +prompt('输入你要猜的数字');
            if(num2 > num1){
                alert('猜大了,继续猜');
            }else if(num2 < num1){
                alert('猜小了,继续猜');
            }else{
                alert('恭喜你,猜对了' + num1);
                break; //打断循环
            }
        }
    </script>