JavaScript高级篇

JavaScript高级篇

一、arguments属性

  • 1.JavaScript中,每一个函数都包含了一个arguments属性

  • 2.arguments属性是一个数组

  • 3.在函数调用时,将实参输入到函数的arguments中,再由arguments将数据传递给形参

  • 4.arguments属性存在,可以将javascript中函数在调用时传递实参与形参进行匹配,增加

    ​ 函数调用灵活性

    <!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>
        <script type="text/javascript">
    
            function fun2() {
                window.alert("fun2在运行时得到实参个数为:" + arguments.length);
                for (var i = 0; i < arguments.length; i++) {
                    window.alert("第 " + (i + 1) + " 个实参的值为:" + arguments[i] + " \n它的数据类型为:" + (typeof arguments[i]))
                }
            }
    
            fun2(123, "str", new Date);
        </script>
    </head>
    
    <body>
    
    </body>
    
    </html>
    

二、function类型对象

  • 1.介绍:

    • 1.function是java中的一种高级数据类型
    • 2.一个function类型对象用于管理一个具体函数
    • JavaScript中functio类型相当于Java中methon类型
  • 2.function类型对象声明方式:

    • 1.标准声明方式
    • 2.匿名声明方式
  • 3.function类型对象声明方式------标准声明方式

    ​ function 函数对象名( ){

    ​ 命令:

    ​ }

  • 4.function类型对象声明方式------匿名声明方式

    var 函数对象名 = function (参数1,参数2){命令1; 命令2;}

  • 5.function类型对象的创建时机

    //浏览器在加载<script>标签的时候,共加载两次
    	第一次加载,将<script>标签所有以标准形式声明函数对象进行创建
    	第二次加载,将<script>标签所有命令行按照自上而下的顺序来执行
    

    验证代码:

    <script type="text/javascript">
            //1.标准声明函数对象方式
            /**
             * 在函数声明之前调用和之后调用都可以执行
             */
            fun1();//命令行
            function  fun1(){
                window.alert("fun1 is run...");
            }
            fun1();//命令行
    
    
            //2、匿名声明函数对象方式
            //fun2()  在声明前使用无法使用,因为在第一次扫描的时候类未创建
            var fun2 = function (){ window.alert("fun2 is run...");} //识别为命令行 在第二次扫描的时候创建
            fun2();//可以使用
    
        </script>
    

三、局部变量与全局变量

  • 局部变量:

    • 1.定义:在函数执行体内,通过var修饰符声明的变量

      function fun1() {

      ​ var name = “mike” ; //局部变量

      }

    • 2.特征:局部变量只能在当前函数执行体使用,不能在函数执行体外使用

  • 全局变量:

    • 定义

      • 1.全局变量可以在当前HTML文件中所有的函数中使用
      • 2.全局变量被声明时,自动分配给window对象作为属性
    • 声明全局变量:

      • 第一种方式:直接在script标签下,通过var声明的变量,就是全局变量
      • 第二种方式:在函数执行体内,没有通过var修饰符修饰的变量也是全局变量

      测试代码

         <script type="text/javascript">
              //全局变量
              var name = "mike";
              var age = 23;
              function  fun1(){
                  var sex = "man" ; //sex属于局部变量
                  home = "江苏"; //home属于全局变量,当这行命令执行时 它相当于:window。home = ”江苏“ ,需要调用函数,才会生成
                  window.alert("fun1"+name);
              }
              fun1();
              window.alert(window.name+window.age);
              window.alert(window.home);
          </script>
      

四、object类型对象特征

  • 1.【定义】:在JavaScript认为在所有通过【构造函数】生成对象其数据类型都是object类型

  • 2.【特征】:object类型对象在创建完毕后,可以根据实际情况,任意添加属性和方法,也可

    ​ 移除属性和方法

  • 3.【属性的维护】:

    • 第一种维护方案:

      • 添加属性:

        ​ object 对象.新属性名 = 值;

      • 添加函数:

        ​ object 对象.新函数对象名 = function( ) { };

    • 第二种维护方案:

      • 添加属性:

        ​ object对象[“新属性名”] = 值;

      • 添加函数:

        ​ object对象[“新函数对象名”]=function( ){ } ;

      • 移除对象属性和方法

        ​ delete object.属性名;

        ​ delete object.函数名;

      测试实例:

       <script type="text/javascript">
      
              //第一种方式
              var obj1 = new Object();//Javascript内置构造函数
              //新增属性
              obj1.sid = 1;
              obj1.name = "hsy";
              obj1.sayHello = function (xname){window.alert(this.name+"与"+xname+"说hello");}
      
              obj1.sayHello("lvhao");
      
              //移除dname属性
              delete obj1.name;
              //再次调用将显示未定义 undefined
              window.alert(obj1.name);
      
      
          </script>
      

五、自定义构造函数

  • 1.命令:

    • function 函数对象名(){

      }

  • 2.调用

    • var object类型对象 = new 函数对象名 ();
  • 3.普通函数与构造函数的区分

    • 1.函数没有调用之前,无法区分函数身份,只能根据函数调用形式区分

    • 2.判断普通函数: var num = 函数对象名();

    • 3.判读构造函数: var num = new 函数对象名()

    • 4.返回值: 普通函数运行后需要通过return将执行结果返回

      ​ 构造函数运行后,直接返回一个object类型对象,此时函数return相当于无效

      测试:

          <script type="text/javascript">
              function  fun1(){
                  return "abc";
              }
              //将fun1作为普通函数进行调用
              var num1 = fun1();
              window.alert("num1= "+num1+"  数据类型为: "+typeof num1);
              //num1= abc  数据类型为: string
              //将fun1作为构造函数进行调用
              var num2 = new fun1();//函数作为构造函数进行调用时,内部return直接失效
              window.alert("num2= "+num2+"  数据类型为: "+typeof num2);
              //num2= [object Object]  数据类型为: object
          </script>
      

六、JavaScript中this指向

​ JavaScript中this指向与Java中的this指向是完全一致的。

  • 在构造函数中,this指向当前构造函数生成object类型对象
  • 在普通函数,this指向调用当前函数的实例对象

七、模拟HasMap

代码实例

    <script type="text/javascript">
        /*
     * 在Java中存在一个HasMap类型
     * 以键值对方式存储数据
     * 一次可以存储多个键值对
     * 并且要求每一个关键字都是唯一
     * 读取可以通过给定关键字读取对应的值
     * 器具体使用方式如下
     * HashMap map = new HashMap();
     * map.put("key1",100)
     * map.put("key2",200)
     * map.get("key1") ==100
     * map.get("key2") ==200
     *
     * JavaScript中并不存在HasMap类型,要求在JavaScript模拟出一个HashMap类型对象
     * 要求具有上述所有功能
     *
     *

     */
        function HashMap(){
            var obj = new Object();
            this.put = function (key , value){
                obj[key]=value;//这句就等于obj。key = value
            }
            this.get = function (key){
                return obj[key];
            }
        }


        var map = new HashMap();
        map.put("key1",100);
        map.put("key2",200);
        var num = map.get("key1");
        window.alert(num);

    </script>

重点

  • data.key 代表 data里面name = "key"的value
  • data[key] 代表data里面name = key 的value

八、JSON

  • 1.前提:JavaScript中得到object类型对象方式

    • 方式1:由构造函数生成的对象都是object类型对象
    • 方式2:由JSON数据描述格式生成的对象都是object类型对象
  • 2.JSON数据描述格式:

    • JavaScript中获得object类型对象简化版
  • 3.标准命令格式:

    ​ var obj = {“属性名1”:值,“属性名2”:值};

  • 4.JSON数组:

    ​ 专门存放JSON对象的数组被称为JSON数组

  • 使用代码实例:

    <script type="text/javascript">
            var obj = {"name":"张三",
                        "sex":"男",
                        "age":15,
                        "toString": function (){
                            window.alert(this.name+this.sex+this.age);
                        }}
            obj.toString();
    
            //JSON最简单的使用方式
            var obj1 = {};
    
            //JSON数组使用方式
            var jsonArray=[
                {"cityId":1,"cityName":"北京市"},
                {"cityId":2,"cityName":"上海市"},
                {"cityId":3,"cityName":"广州市"},
            ];
            for(var i=0;i<jsonArray.length;i++){
                var obj2 = jsonArray[i];
                window.alert(obj2.cityId+obj2.cityName);
            }
        </script>
    

代码实例:

1.利用反射封装JSON工具类

package com.util;


import java.lang.reflect.Field;

/**
 * Created by IntelliJ IDEA.
 * User: LvHaoIT (asus)
 * Date: 2021/5/20
 * Time: 11:21
 */
public class ReflectUitl {

    /**
     *将任意类型对象内容转换为JSON格式字符串返回
     * @param obj
     * @return
     */
    public static String jsonObject(Object obj){
        Class classFile = null;
        Field fieldArray[]=null;
        StringBuffer json = new StringBuffer("{");
        //field用来存放类的属性,功能有获取当前对象的成员变量的类型,
        // 对成员变量重新设值
        //1.获得当前对象的class文件
        classFile = obj.getClass();
        //2.获得class文件的所有属性
        fieldArray=classFile.getDeclaredFields();
        //3.获得当前对象所有属性的值
        for(int i = 0 ;i<fieldArray.length;i++){
            Field field = fieldArray[i];
            /**
             * getName() : 获取属性的名字
             *
             * get(Object obj) 返回指定对象obj上此 Field 表示的字段的值
             *
             * set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值
             */
            field.setAccessible(true);//确保私有属性可以访问使用
            String fieldName = field.getName();
            try {
                Object value = field.get(obj);//将其值返回
                //4.将获得的字符串及其值凭借为json格式字符串
                //将属性名和属性值进行字符串拼接
                json.append("\"");
                json.append(fieldName);
                json.append("\":");
                json.append("\"");
                json.append(value);
                json.append("\"");

            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            if((i+1)<fieldArray.length)
             json.append(",");
        }
        json.append("}");
        return json.toString();
    }

}

oneServlet

package com.controller;

import com.entity.Student;
import com.util.ReflectUitl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by IntelliJ IDEA.
 * User: LvHaoIT (asus)
 * Date: 2021/5/20
 * Time: 10:58
 */
public class oneServlet extends HttpServlet {
    //对get方法进行处理
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Student stu = new Student(1,"hsy"); //这种传值是错误的,高级类型传的是内存地址
       // String stu ="{\"stuId\":10,\"stuName\":\"hsy\"}";
        //转换为json格式
        String json =  ReflectUitl.jsonObject(stu);
        //放入请求作用域对象
        request.setAttribute("key",json);
        //转到jsp运行
        request.getRequestDispatcher("/index.jsp").forward(request,response);

    }
}

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: asus
  Name: 吕昊
  Number: 20180508145
  Date: 2021/5/20
  Time: 10:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
    <script type="text/javascript">
     var obj = ${requestScope.key};
     window.alert(obj.stuId+obj.stuName);

    </script>
  </head>
  <body>
  $END$
  </body>
</html>

2.使用JSON工具类

twoServlet

package com.controller;

import com.entity.Dept;
import net.sf.json.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by IntelliJ IDEA.
 * User: LvHaoIT (asus)
 * Date: 2021/5/20
 * Time: 23:31
 */
public class twoServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Dept dept = new Dept(1,"徐州工程学院","徐州"); //这种传值是错误的,高级类型传的是内存地址

        JSONObject jsonObject = JSONObject.fromObject(dept);//利用json工具类来转换成json字符串
        request.setAttribute("key1",jsonObject.toString());
        //转到jsp运行
        request.getRequestDispatcher("/index_1.jsp").forward(request,response);

    }
}

index_1.jsp

<%--
  Created by IntelliJ IDEA.
  User: asus
  Name: 吕昊
  Number: 20180508145
  Date: 2021/5/20
  Time: 23:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function fun1(){
            var dept = ${requestScope.key1};
            document.getElementById("deptNo").value=dept.deptNo;
            document.getElementById("deptName").value=dept.deptName;
            document.getElementById("loc").value=dept.loc;
        }



    </script>
</head>
<body onload="fun1()">

<table border="2">
    <tr>
        <td>部门编号</td>
        <td><input type="text" id="deptNo"></td>
    </tr>
    <tr>
        <td>部门名称</td>
        <td><input type="text" id="deptName"></td>
    </tr>
    <tr>
        <td>部门编号</td>
        <td><input type="text" id="loc"></td>
    </tr>
</table>
  
  </body>
</html>

3.使用JSON工具类实现json数组

threeServle

package com.controller;

import com.entity.Dept;
import net.sf.json.JSONArray;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by IntelliJ IDEA.
 * User: LvHaoIT (asus)
 * Date: 2021/5/21
 * Time: 0:21
 */
public class threeServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得一个集合存放部门对象
        List DeptList = new ArrayList();
        DeptList.add(new Dept(10,"徐州工程学院","徐州"));
        DeptList.add(new Dept(20,"淮阴工学院","淮安"));
        DeptList.add(new Dept(30,"三江学院","南京"));

        JSONArray jsonArray = JSONArray.fromObject(DeptList);//利用json工具类,转换json对象
        //调用请求对象,请求作用域对象
        request.setAttribute("key2",jsonArray);
        //请求转发
        request.getRequestDispatcher("/index_2.jsp").forward(request,response);
    }
}

index_2.jsp

<%--
  Created by IntelliJ IDEA.
  User: asus
  Name: 吕昊
  Number: 20180508145
  Date: 2021/5/21
  Time: 0:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function  fun1(){
            var jsonArray = ${requestScope.key2};//获取对象
            //利用for循环输出
            for(var i=0;i<jsonArray.length;i++){
                var jsonObj = jsonArray[i];//获取当前对象
                //在页面中创建新的表行
                var trDom = document.createElement("tr");//<tr></tr>
                var tdDOm_1 = document.createElement("td")//<td>
                var tdDOm_2 = document.createElement("td")//<td>
                var tdDOm_3 = document.createElement("td")//<td>
                tdDOm_1.innerHTML=jsonObj.deptNo;
                tdDOm_2.innerHTML=jsonObj.deptName;
                tdDOm_3.innerHTML=jsonObj.loc; //向td中插值
                trDom.appendChild(tdDOm_1);//插入对应位置 ,插入到tr中
                trDom.appendChild(tdDOm_2);
                trDom.appendChild(tdDOm_3);
                document.getElementById("one").appendChild(trDom);//放入位置
            }
        }
    </script>

</head>
<body onload="fun1()">
<center>
 <table border="2" align="center"  id="one">
     <tr>
         <td>部门编号</td>
         <td>部门名称</td>
         <td>部门地址</td>
     </tr>
 </table>
</center>
  </body>
</html>

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LvhaoIT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值