JavaWeb(3)JavaScript基础

1. JavaScript概念

1. JavaScript概述:客户端脚本语言
(1)运行在客户端浏览器中的,每一个浏览器都有JavaScript的解析引擎
(2)脚本语言:不需要编译,直接可以被浏览器解析执行

2. JavaScript功能:可以用来增强用户和HTML页面的交互过程,可以用来控制HTML元素,让页面有一些动态效果,增强用户体验

3. JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)

4. ECMAScript概述:客户端脚本语言的标准

5. JS与HTML结合方式
(1)内部JS:定义<script>标签,标签里书写JS代码。【注意】<script>标签定义的位置会影响执行顺序
(2)外部JS:外部定义<script>,通过src属性引入外部的JS文件

2. ECMAScript语法

1. 注释
(1)单行注释://注释内容
(2)多行注释:/*注释内容*/

2. 数据类型
(1)数据类型的分类:可以分为基本数据类型和引用数据类型
(2)基本数据类型

1. number:数字(整数、小数、NaN)
2. string:字符串("abc"、'abc'。【JS中不区分单引号和双引号】)
3. boolean:true或者false
4. null:空类型(对象的占位符)
5. undefined:未定义(如果一个变量没有被初始化值,默认为undefined)

(3)引用数据类型:对象(Object),数组(Array),函数(Function)

3. 变量
(1)JS是一门弱类型语言,定义变量时,不需要指定其数据类型
(2)语法:var 变量名 = 初始化值
(3)typeof:获取变量的数据类型

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			var num1 = 100;
			var num2 = 3.14;
			var str1 = "abc";
			var str2 = 'aaa';
			var flag = true;
			var obj = null;
			
			alert(typeof num1);   //number
			alert(typeof num2);   //number
			alert(typeof str1);   //string
			alert(typeof str2);   //string
			alert(typeof flag);   //boolean
			alert(typeof obj);    //object
		</script>
	</head>
	<body>
	</body>
</html>

4. 运算符

(1)一元运算符:+(正) -(负) ++ - -

  • 自动类型转换:当你给一个运算符的值,和他所期望的值不一样的时候,他会尝试着去转换
  • 字符串转换数字:根据字符串字面上的值去转换,如果能转换过来,就转成数字,如果转换不过来,就转换成NaN
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			var num = +"100";
			alert(num);  //100

			var str = num + 100;
			alert(str);  //200

			//true转换为1,false转换为0
			var flag = true;
			alert(1 + flag);  //2

			alert(1 * "100" + 200 + 1 * "200");  //500
			
			//根据字符串字面上的值去转换,如果能转换过来,就转成数字,如果转换不过来,就转换成NaN
			var num2 = +"abc100";
			alert(num2 + 10);  //NaN
		</script>
	</head>
	<body>
	</body>
</html>

(2)算术运算符:+、-、*、/ 【和Java用法一致,NaN参数数学运算结果都是NaN】

(3)赋值运算符:=、+=、-= 【和Java用法一致】

(4)比较运算符:>、<、>=、<=、== 、===(全等于)

  • 类型相同:直接比较(字符串按字典顺序进行比较,按位逐一比较,直到得出大小为止)
  • 类型不同:先进行类型转换,在比较
  • ===:全等于,在比较之前先判断类型,如果类型不一致直接返回false
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//NaN参与比较运算结果都是false,除了!=
			alert(NaN == NaN);   //false
			alert(NaN != NaN);   //true
			
			alert("100" == 100);   //true
			alert(+"100.00" == 100);  //true
			
			//字符串按字典顺序进行比较,按位逐一比较,直到得出大小为止
			alert("abc" == "abcd");   //false						
			
			//=== 全等于:先比较数据类型是否一致,如果数据类型不一致,直接false
			alert("100" === 100);    //false
		</script>
	</head>
	<body>
	</body>
</html>

(5)逻辑运算符:&&、||、!

  • 其他类型转boolean:①number:0或NaN为false,其他为true;② string:除了空字符串(""),其他都是true;③null&undefined:都是false;④对象:所有对象都为true;
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//number:0或NaN为false,其他为true
			alert(!2);   //false
			
			//string:除了空字符串(""),其他都是true
			if("abc"){
				alert(true);
			}else{
				alert(false);
			}    //true
			
			//null&undefined:都是false
			var a;  //undefined
			if(a && NaN){
				alert(true);
			}else{
				alert(false);
			}    //false
			
			//对象:所有对象都为true
			var obj = new Object();
			if(obj){
				alert(true);
			}else{
				alert(false);
			}    //true
		</script>
	</head>
	<body>
	</body>
</html>

5. 逻辑控制语句【和Java用法一致】

//打印99乘法表
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			for(var i = 1;i <= 9;i++){
				for(var j = 1;j <= i;j++){
					document.write(i + "*" + j + "=" + (i * j) + "&nbsp");
				}
				document.write("<br>")
			}
		</script>
	</head>
	<body>
	</body>
</html>

在这里插入图片描述

6. 函数
(1)函数的概念:类似于Java中的方法,封装一段逻辑功能以实现重复调用
(2)JS中定义函数的方式:

方式1:
function 方法名称(形式参数列表){
		方法体
}

方式2:
var 方法名 = function(形式参数列表){
		方法体
}

方式3:
var 方法名 = new Function(形式参数列表,方法体)   //不推荐!
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			/* 方式1:
			function 方法名称(形式参数列表){
					方法体
			} */
			function test(){
				alert("abc");
			}
			test();   //abc
			
			/* 方式2:
			var 方法名 = function(形式参数列表){
					方法体
			} */
			var test2 = function(){
				alert("abcabc");
			}
			test2();   //abcabc
			
			/* 方式3:
			var 方法名 = new Function(形式参数列表,方法体)   //不推荐! */
			var test3 = new Function("a","b","alert(a + b)");
			test3(2,3);    //5
		</script>
	</head>
	<body>
	</body>
</html>

(3)属性:length:代表形参的个数
(4)特点:

1. 方法定义时,形参的类型不用写,返回值类型也不写。
2. 方法是一个对象,如果定义名称相同的方法,会覆盖
3. 在JS中,方法的调用只与方法的名称有关,和参数列表无关
4. 在方法声明中有一个隐藏的内置对象(数组),arguments,封装所有的实际参数
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//方法定义时,形参的类型不用写,返回值类型也不写
			function fun1(a,b){
				alert(a);
				alert(b);
				return a+b;
			}
			var sum1 = fun1(10,20);   //10 20
			alert(sum1);   //30
			
			//在JS中,方法的调用只与方法的名称有关,和参数列表无关
			//JS中的形参和实参不需要一一对应
			var sum2 = fun1();   //undefined undefined
			alert(sum2);   //NaN
			
			//在方法声明中有一个隐藏的内置对象(数组,arguments,封装所有的实际参数
			//属性:length:代表形参的个数
			function fun2(){
				return arguments[0] + arguments[1] + arguments[2]
			}
			var num = fun2.length;
			alert(num)  //0
			var sum3 = fun2(10,20,30);
			alert(sum3);   //60
		</script>
	</head>
	<body>
	</body>
</html>

(5)void运算符:拦截返回值,一般与<a>结合使用,保留可被点击的功能

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			function toBaidu(){
				if(window.confirm("你要进入百度吗?")){
					window.open("https://www.baidu.com");
				}
			}
		</script>
	</head>
	<body>
		<!-- a标签,默认有两个行为,可点击,可以跳转页面。 -->
		<a href="https://www.baidu.com">进入百度</a>
		
		<!-- 我只想保留a标签可以点击的功能,但是不想让他跳转页面。 -->
		<a href="#">进入百度2</a>
		
		<!-- 我只想保留a标签可以点击的功能,但是不想让他跳转页面。 -->
		<a href="javascript:void(0)">进入百度3</a>
		
		<!-- 点击a标签可以调用函数 -->
		<a href="javascript:void(toBaidu())">进入百度4</a>
	</body>
</html>

3. JavaScirpt内置对象1:String对象

1. 定义方式:

定义方式1:String str = new String("abc");
定义方式2:var str = "abc";

2. 属性:length:字符串的长度

3. 方法

1. charAt():返回在指定位置的字符
2. concat():连接字符串
3. indexOf():根据字符检索此符在字符串中的索引
4. lastIndexOf():从后向前搜索字符串
5. substring():提取字符串中两个指定的索引号之间的字符
6. toLowerCase():把字符串转换为小写
7. toUpperCase():把字符串转换为大写
8. replace():替换字符串
9. split():把字符串分割为字符串数组
10. trim():去除字符串两端的空格
	trimRight():去右端空格
	trimLeft():去左端空格	
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//定义方式1:String str = new String("abc");
			var str = new String("abcdef")
			//定义方式2:var str = "abc"; 
			var str2 = "你好"
			
			//length:字符串的长度
			var len = str.length;
			alert(len);  //6
			
			//1. charAt():返回在指定位置的字符
			alert(str.charAt(2));   //c
			
			//2. concat():连接字符串
			alert(str.concat(str2));   //abcdef你好
			
			//3. indexOf():根据字符检索此符在字符串中的索引
			alert(str.indexOf(c));    //2
			
			//4. lastIndexOf():从后向前搜索字符串
			alert(str.lastIndexOf(d));    //2
			
			//5. substring():提取字符串中两个指定的索引号之间的字符(含头不含尾)
			alert(str.substring(0,3));   //abc
			
			//6. toLowerCase():把字符串转换为小写
			alert(str.toLowerCase());    //abcdef
			
			//7. toUpperCase():把字符串转换为大写
			alert(str.toUpperCase());    //ABCDEF
			
			//8. replace():替换字符串
			alert(str.replace("a","z"));    //zbcdef
			
			//9. split():把字符串分割为字符串数组
			alert("a#b#c#d".split("#"));    
			
			//10. trim():去除字符串两端的空格
			alert("  abcd   ".trim());	   //abcd			
		</script>
	</head>
	<body>
	</body>
</html>

4. JavaScirpt内置对象2:Number对象

1. 定义方式:

定义方式1:var num = new Number(222);
定义方式2:var num = Number(222);

2. 方法

1. toString():把数字类型转换成字符串类型
2. toPrecision():把数字格式为指定的长度(也就是小数后保留几位)
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//定义方式1:var num = new Number(222);
			var num1 = 2222.3333;
			//定义方式2:var num = Number(222);
			var num2 = Number(3.1415926);
			
			//1. toString():把数字类型转换成字符串类型
			var str = num1.toString();
			alert(str);   //2222.3333
			
			//2. toPrecision():把数字格式为指定的长度(也就是小数后保留几位)
			var n = num2.toPrecision(3);
			alert(n);  //3.14
		</script>
	</head>
	<body>
	</body>
</html>

5. JavaScirpt内置对象3:Math对象

1. Math对象的特点:Math对象不需要创建,直接使用(Math.方法名())

2. 方法:

1. Math.random();随机产生0----1 之间的随机数    
2. Math.round(2.36); 对小数进行四舍五入  得到一个整数    
3. Math.min(15,25); 取最小值
4. Math.max(15,25);取最大值
5. Math. abs(-2) 返回数的绝对值。 
6. Math.floor(2.6);向下取整
7. Math.ceil(3.82);向上取整
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//1. Math.random();随机产生0----1 之间的随机数    
			var num1 = Math.random();
			alert(num1);   //0.286856124
			
			//2. Math.round(2.36); 对小数进行四舍五入  得到一个整数    
			var num2 = Math.round(2.36);
			alert(num2);   //2
			
			//3. Math.min(15,25); 取最小值
			var num3 = Math.min(15,25);
			alert(num3);   //15
			
			//4. Math.max(15,25);取最大值
			var num4 = Math.max(15,25);
			alert(num4);   //25
			
			//5. Math. abs(-2) 返回数的绝对值
			var num5 = Math.abs(-2);
			alert(num5);    //2
			
			//6. Math.floor(2.6);向下取整
			var num6 = Math.floor(2.6);
			alert(num6);   //2
			
			//7. Math.ceil(3.82);向上取整
			var num7 = Math.ceil(3.82);
			alert(num7);   //4
		</script>
	</head>
	<body>
	</body>
</html>

6. JavaScirpt内置对象4:Date对象

1. 创建方式:var date = new Date();

2. 方法:

1. toLocaleString():返回当前date对象对应的时间本地字符串格式
	toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串
	toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串
2. getTime():获取毫秒值。返回当前如期对象描述的时间到1970年1月1日零点的毫秒值差
	getFullYear():获取年
	getMonth():获取月
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//1. 创建方式:var date = new Date();
			var myDate = new Date();
			
			//toLocaleString():返回当前date对象对应的时间本地字符串格式
			var str1 = myDate.toLocaleString();
			document.write(str1);   //2020/7/13 下午10:45:36
			
			//toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串
			var str2 = myDate.toLocaleTimeString();
			document.write(str2);   //下午10:45:36
			
			//toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串
			var str3 = myDate.toLocaleDateString();
			document.write(str3);    //2020/7/13
			
			//getTime():获取毫秒值。返回当前如期对象描述的时间到1970年1月1日零点的毫秒值差
			var time = myDate.getTime();
			document.write(time);   //1594651536235
			
			//getFullYear():获取年
			var year = myDate.getFullYear();
			document.write(year);   //2020
			
			//getMonth():获取月
			var month = myDate.getMonth();
			document.write(month);    //6
		</script>
	</head>
	<body>
	</body>
</html>

7. JavaScirpt内置对象5:Array对象

1. 创建数组的方式:

1. 创建数组的方式1:var arr = new Array();
2. 创建数组的方式2:var arr = new Array(数组长度);
3. 创建数组的方式3:var arr = new Array(数组元素);
4. 创建数组的方式4:var arr = [数组元素];

2. 属性:length:数组的长度

3. JS中数组的特点:
(1)数组的长度是可变的
(2)数组中可以存放多种数据类型的元素
(3)JS中的数组类似于Java中的List集合

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//创建数组的方式1:var arr = new Array();
			var arr1 = new Array();
			
			//创建数组的方式2:var arr = new Array(数组长度);
			var arr2 = new Array(5);
			
			//创建数组的方式3:var arr = new Array(数组元素);
			var arr3 = new Array(1,2,3.14,true,"abc",'z');
			
			//创建数组的方式4:var arr = [数组元素];
			var arr4 = [1,2,3.14,true,"abc",'z']
			
			//length:数组的长度
			var len = arr4.length;
			document.write(len);   //6
		</script>
	</head>
	<body>
	</body>
</html>

4. 方法:

1. concat():连接两个或更多的数组,并返回结果
2. join(参数):把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔
3. pop():删除并返回数组的最后一个元素 
4. push():向数组的末尾添加一个或更多元素,并返回新的数组长度
5. reverse():颠倒数组中元素的顺序
6. sort():对数组的元素进行排序  从小到大
7. slice():根据起始索引和终止索引,截取旧数组中的一部分元素,到一个新数组中,含头不含尾
8. splice() 删除元素,并向数组添加新元素
9. every():检测数值元素的每个元素是否都符合条件
10. filter():检测数值元素,并返回符合条件所有元素的数组
11. forEach():数组每个元素都执行一次回调函数
12. map()	通过指定函数处理数组的每个元素,并返回处理后的数组
13. reduce():将数组元素计算为一个值(从左到右)
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			var arr1 = [10,20,30];
			var arr2 = [1,2,3];
			
			//1. concat():连接两个或更多的数组,并返回结果
			var arr3 = arr1.concat(arr2);
			document.write(arr3);   //10,20,30,1,2,3
			document.write("<br>");
			
			//2. join(参数):把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔
			var str = arr1.join("-");
			document.write(str);    //10-20-30
			document.write("<br>");
			
			//3. pop():删除并返回数组的最后一个元素 
			var num = arr1.pop();
			document.write(num);   //30
			document.write(arr1);  //10,20
			document.write("<br>");
			
			//4. push():向数组的末尾添加一个或更多元素,并返回新的数组长度
			var len = arr2.push(4);
			document.write(len);    //4
			document.write(arr2);   //1,2,3,4
			document.write("<br>");
			
			//5. reverse():颠倒数组中元素的顺序
			arr2.reverse();
            document.write(arr2);   //4,3,2,1
			document.write("<br>");
			
			//6. sort():对数组的元素进行排序  从小到大
			arr2.sort();
			document.write(arr2);    //1,2,3,4
			document.write("<br>");
			
			//7. slice():根据起始索引和终止索引,截取旧数组中的一部分元素,到一个新数组中,含头不含尾
			var newArr = arr2.slice(0,2);
			document.write(newArr);  //1,2
			document.write("<br>");
			
			//8. splice() 删除元素,并向数组添加新元素
			var arr11 = [1,2,3,4,5,6,7];
			arr11.splice(1,1,20);  //从索引1开始,删除1个元素,并补进去20
			document.write(arr11);   //1,20,3,4,5,6,7
			document.write("<br>");
			
			//9. every():检测数值元素的每个元素是否都符合条件
			var arr22 = [1,2,3,4,5,6,7];
			var flag = arr22.every(function(ele){
				return ele > 5;   //判断数组中是否每一个元素都大于5
			});
			document.write(flag);   //false
			document.write("<br>");
			
			//10. filter():检测数值元素,并返回符合条件所有元素的数组
			var arr33 = [1,2,3,4,5,6,7];
			var newArr33 = arr33.filter(function(ele){
				return ele > 5;   //取出大于5的元素,并过滤到一个新数组
			})
			document.write(newArr33);  //6,7
			document.write("<br>");
			
			//11. forEach():数组每个元素都执行一次回调函数
			var arr44 = [1,2,3,4,5,6,7];
			arr44.forEach(function(ele,index){
				document.write(index + "->" + ele)  //0->1 1->2 .... 6->7
				document.write("<br>");
			});
			
			//12. map()	通过指定函数处理数组的每个元素,并返回处理后的数组
			var arr55 = [1,2,3,4,5,6,7];
			var newArr55 = arr55.map(function(ele){
				return Math.pow(ele,2);   //计算每个元素的平方  
			});
			document.write(newArr55);   //1,4,9,16,25,36,49
			document.write("<br>");
			
			//13. reduce():将数组元素计算为一个值(从左到右)
			var arr66 = [1,2,3,4,5,6,7];
			var sum = arr66.reduce(function(sum,ele,index,arr){
				return sum + ele;
			},0);
			document.write(sum);   //28
		</script>
	</head>
	<body>
	</body>
</html>

5. 二维数组

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//定义一个数组
			var arr = [];
			
			//定义两个小数组
			var one = [1,2,3,4,5,6];
			var two = [10,20,30,40,50,60];
			
			//定义二维数组
			arr[0] = one;
			arr[1] = two;
			
			//遍历该二维数组
			for(var i = 0;i < arr.length;i++){
				for(var j = 0;j < arr[i].length;j++){
					document.write(arr[i][j]);
					document.write("<br>")
				}
			}
			
			//定义二维数组简便方式
			var arr2 = [[1,2,3],[10,20,30]];
		</script>
	</head>
	<body>
	</body>
</html>

8. JavaScirpt内置对象6:Global对象

1. Global对象的特点:全局对象,这个Global中封装的方法不需要对象就可以直接调用

2. 使用方法:方法名();

3. 两个常用的方法:

1. isNaN():检查某个值是不是NaN
2. parseInt():解析一个字符串并返回一个整数,从左向右依次查找,每一位是否是数字,直到遇到不是数字为止。将前边的值转为数字
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//1. isNaN():检查某个值是不是NaN
			var val1 = NaN;
			var val2 = "abc";
			var val3 = 123;
			
			var flag1 = isNaN(val1);
			var flag2 = isNaN(val2);
			var flag3 = isNaN(val3);
			
			document.write(flag1);  //true
			document.write(flag2);  //true
			document.write(flag3);  //false
			
			//parseInt():解析一个字符串并返回一个整数
			//从左向右依次查找,每一位是否是数字,直到遇到不是数字为止。将前边的值转为数字
			var value = parseInt("1122abc");
			document.write(value);   //1122
			
			var value2 = parseFloat("3.14abc");
			document.write(value2);   //3.14
			
		</script>
	</head>
	<body>
	</body>
</html>

9. JavaScirpt内置对象7:RegExp对象

1. RegExp对象:正则表达式对象

2. 正则表达式回顾

1. 单个字符:[]
	如: [a] [ab] [a-zA-Z0-9_]
	特殊符号代表特殊含义的单个字符:
		\d:单个数字字符 [0-9]
		\s:查找空白字符。
		\b:匹配单词边界。
		\w:单个单词字符[a-zA-Z0-9_]
2. 量词符号:
	?:表示出现0次或1次
	*:表示出现0次或多次
	+:出现1次或多次
	{m,n}:表示 m<= 数量 <= n
		m如果缺省: {,n}:最多n次
		n如果缺省:{m,} 最少m次
3. 开始结束符号
	^:开始
	$:结束

3. 正则表达式对象使用:

1. 创建方法:
	①var reg = new RegExp("正则表达式");
	②var reg = /正则表达式/

2. 方法:
	test(参数):验证指定的字符串是否符合正则定义的规范,返回一个boolean类型的值
	exec(参数):检索字符串中指定的值。返回找到的值,并确定其位置
	search(参数):类似于indexOf()方法,比他强大一下,可以根据正则去查找。检索不到返回-1

3. 修饰符:
	i:执行对大小写不敏感的匹配
	g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
	m:执行多行匹配

4. 代码示例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript">
			//1.匹配字符串
			var str = "hello123";
			//注意加上^和$,不然不会去整体匹配
			var regx = /^[A-Z0-9]+$/i;
			document.write("匹配吗?" + regx.test(str));   //匹配吗?true
			document.write("<br>");
			
			//2.获取出下面字符串中是3个字符组成的单词
			var str2 = "hahahah abc lol dnf wow ajdkal ";
			var regx2 = /\b[a-z]{3}\b/gi;
			var out;
			while((out = regx2.exec(str2)) != null){
				document.write(out);   //abc lol dnf wow
				document.write("<br>");
			}
			
			//3.查找lol在字符串的哪一个索引处
			var str3 = "hahahah abc lol dnf wow ajdkal ";
			var index = str3.search("lol");
			document.write(index);   //12
		</script>
	</head>
	<body>
	</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值