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) + " ");
}
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>