JavaScript
JavaScript因为互联网而生,紧随着浏览器的出现而问世
1、JavaScript 的历史
https://javascript.ruanyifeng.com/introduction/history.html
js参数 | 描述 |
---|---|
throw | 声明的作用是创建exception(异常或错误) |
this的四种用法
1.在一般函数方法中使用this指代全局对象
2.作为对象方法调用,this指代上级对象
3.作为构造函数调用,this指代new出的对象
4.apply调用,apply方法作用是改变函数的调用对象,此方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数
1.JS的引入方式
直接引入和文件引用
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>ll</title>
<!--JS引入方式-->
<!--直接编写-->
<script>
console.log("hello")
</script>
<!--导入文件-->
<script src="js.js"></script>
</head>
<body>
</body>
</html>
2.ECMAscript基本语法
JS是一门弱类型的编程语言,属于基于对象和基础原型的脚本语言。
声明变量
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>ll</title>
<script>
var x; //声明一个变量
x = 10; //给变量赋值
console.log("x = "+x);
var y = 20; //声明并赋值
console.log("y = "+y);
var name = "li" , age = 18; //声明多个变量并赋值,并且可以是不同类型
console.log("name="+name,"age="+age);
school = "xiuxiu"; //声明全局变量
console.log("school="+school);
var z; //一个变量只声明,未赋值,变量:undefined
console.log(z);
var q = 10; //申明一个变量
q = 40; //将上面变量重新赋值
console.log("q="+q);
var e = 88; //声明赋值一个变量
var e = 68; //声明赋值一个变量
console.log("e="+e);
</script>
</head>
<body>
</body>
</html>
1.声明变量时,可以不用var 那么它就是全局变量
2.变量命名,首字符只能是字母,下划线,$美元符,余下的字符可以是下划线,美元符号或者任何字母或者数字字符并区分大小写。
注释
// 单行注释
/*
多行注释
*/
语句分隔符
var a = 1 //分号和换行符作为语句分隔符
var b = 2;
3.ECMAScript 基本数据类型
根据数据类型不同,有的变量存在栈中,有的存储的堆中。
具体区别:
原始变量及他们的值存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始变量互不影响。
应用值是把引用变量的名称存储在栈中,但是把其实际对象对出在堆中,且存在一个指针由变量名指向存储在堆中的实际对象,当把引用对象传递给另一个变量时,复制的其实是指向实际对象的指针,此时两者指向的是同一个数据,若通过方法改变其中一个变量的值,则访问另一个变量时,其值也会随之加以改变;但若不是通过方法而是通过重新赋值 此时 相当于 重新开了一个房间 该值的原指针改变,则另一个值不会随他的改变而改变。
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>ll</title>
<script>
//初始值类型
var a = "li";
var b =a;
a = "alvin";
console.log(a); //alvin
console.log(b); //li
//对象类型
var arr1=[1,2];
arr2 = arr1;
arr1.push(3);
console.log(arr1); //[1, 2, 3]
console.log(arr2); //[1, 2, 3]
arr1 = [4,5];
console.log(arr1); //[4, 5]
console.log(arr2); //[1, 2, 3]
</script>
</head>
<body>
</body>
</html>
基础数据类型
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var num1 = 12;
var num2 = 3.14;
var b = true;
var s = "li";
var s2 = new String("li");
console.log(num1,typeof num1);
console.log(num2,typeof num2);
console.log(b,typeof b);
console.log(s,typeof s);
console.log(s2,typeof s2);
</script>
</head>
<body>
</body>
</html>
3.1 Math对象
参数 | 描述 |
---|---|
toFixed(x) | 保留小数位 |
Math参数
参数 | 描述 |
---|---|
abs(x) | 返回数值的绝对值 |
ceil(x) | 向上取整 |
floor(x) | 向下取整 |
max(x,c,v,,n) | 取最大值 |
min(x,c,v,,n) | 取最小值 |
pow(x,y) | 求x的y次幂 |
random() | 生成0-1随机数 |
round(x) | 取整,四舍五入 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//Number 对象的内置方法
//toFixed(x) 保留小数位
var num = 100.3;
var ret = num.toFixed(2);
console.log(num) ; //100.3
console.log(ret); //100.30
//Math对象的内置方法
//abs(x) 返回数值的绝对值
var num = -10;
console.log(Math.abs(num)); //10
//ceil(x) 向上取整
var num = 10.9;
console.log(Math.ceil(num)); //11
//floor(x) 向下取整
var num = 10.4;
console.log(Math.floor(num)); //10
//max(x,y,z,,,) 取最大值
console.log(Math.max(2,10,15));
//min(x,y,z,,,,) 取最小值
console.log(Math.min(2,10,5,1));
//pow(x,y) 求x的y次方
console.log(Math.pow(3,2)); //3**2 = 9
console.log(3**2); //9
//random() 生成0-1随机数
console.log(Math.random()); //0.9195357407227698
console.log(Math.random()*10); //生成0-10之间的数值 8.556297199661074
//round(x) 四舍五入
//生成0-10之间的随机整数
console.log(Math.round(Math.random()*10)) //8
</script>
</head>
<body>
</body>
</html>
练习:获取1-100的随机整数,包含1-100
var num = Math.random(); //获取随机数
num = num * 100; //获取0-100的随机数
num = Math.round(num); //取整,四舍五入
console.log(num) //打印
3.2 Date对象
创建Date对象
// 方法1:不指定参数
var newd1 = new Date();
console.log(newd1); //Wed Apr 07 2021 19:11:25 GMT+0800 (中国标准时间)
console.log(newd1.toLocaleString()); //2021/4/7下午7:11:25
//方法2:参数为时间字符串
var newd2 = new Date("2020.4.20 11:12:23");
console.log(newd2); //Mon Apr 20 2020 11:12:23 GMT+0800 (中国标准时间)
console.log(newd2.toLocaleString()); //2020/4/20上午11:12:23
console.log(newd2.getFullYear()) ; //2020
// 方法3:参数为毫秒数
var d3 = new Date(5000); //unix开始时间过了5000毫秒
console.log(d3.toLocaleString()); //1970/1/1上午8:00:05
console.log(d3.toUTCString()); //Thu, 01 Jan 1970 00:00:05 GMT
//方法4:参数为年月日小时分钟秒毫秒
var d5 = new Date(2021,2,20,11,12,0,300);
console.log(d5.toLocaleString()); //2021/3/20上午11:12:00
时间显示方式
toLocaleString() 中国时间显示,毫秒并不直接显示(中国标准时间)
toUTCString() Unix时间
getDate() 获取日
getDay () 获取星期
getMonth () 获取月(0-11)
getFullYear () 获取完整年份
getYear () 获取年
getHours () 获取小时
getMinutes () 获取分钟
getSeconds () 获取秒
getMilliseconds () 获取毫秒
getTime () 返回累计毫秒数(从1970/1/1午夜)
练习:以2021年03月2日 14:1:43 星期二 格式化输出当前时间
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function getCurrentDate() {
//1.创建Date对象
var date = new Date(); //没有填入任何参数那么就是当前时间
// 2.获取当前年份
var year = date.getFullYear();
//3.获取当前月份,js中月份是从0-11
var month = date.getMonth()+1;
//4.获得当前日
var day = date.getDate();
//5.获取当前小时
var hour = date.getHours();
//6.获得当前分钟
var min = date.getMinutes();
//7.获得当前秒
var sec = date.getSeconds();
//8.获得当前星期
var week = date.getDay();
return year+"年"+changeNum(month)+"月"+day+"日"+hour+":"+min+":"+sec+" "+parseweek(week)
}
//解决:月份自动补齐两位数字的方法
function changeNum(num){
if(num < 10){
return "0"+num;
}else{
return num;
}
}
//解决:将星期数据 0-6 转换成 星期日到星期六
function parseweek(week){
var arr = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
// 0 1 2 3 4 5 6
return arr[week]
}
console.log(getCurrentDate())
</script>
</head>
<body>
</body>
</html>
结果:2021年04月7日20:17:33 星期三
3.3 JSON对象
stringify() 序列化
parse() 反序列化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var info = {"name":"li","age":18,"gender":"male"}; //json对象
console.log(info);
var info = {'name':'li','age':19,'gender':'male'}; //json对象
console.log(info);
var name = "yuan";
var info = {name:name,age:18,gender:"male"}; //json对象
console.log(info);
console.log(info["name"]); //yuan
console.log(info.name); //yuan
//stringify()序列化 和 parse()反序列化
var info = {'name':'li','age':19,'gender':'male'};
console.log(JSON.stringify(info)); //{"name":"li","age":19,"gender":"male"}
var s = '{"name":"li","age":19,"gender":"male"}' ;
console.log(JSON.parse(s)); //{name: "li", age: 19, gender: "male"}
for (var i in info){
console.log(i,info[i])
}
//name li
//age 19
//gender male
</script>
</head>
<body>
</body>
</html>
3.4 数组对象
创建数组
创建方式1:
var arrname = [元素0,元素1,….]; // var arr=[1,2,3];
创建方式2:
var arrname = new Array(元素0,元素1,….); // var test=new Array(100,"a",true);
数组方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//获取指定下标的成员
var arr = ["yuan",123,true];
console.log(arr); //["yuan", 123, true]
// push() 给数组后面追加成员
var arr1 = [1,2,3,4];
arr1.push(5);
console.log(arr1); //[1, 2, 3, 4, 5]
//pop() 删除最后一个成员作为返回值
arr1.pop();
console.log(arr1) ; //[1, 2, 3, 4]
// unshift() 将value的值插入到数组的开始
var arr2 = [1,2,3,4];
arr2.unshift(5);
console.log(arr2); //[5, 1, 2, 3, 4]
//shift 将数组的第一个元素删除
arr2.shift();
console.log(arr2); //[1, 2, 3, 4]
//reverse() 反转排序
var arr = [1,2,3,4,5];
arr.reverse();
console.log(arr);
//slice() 切片,开区间
var arr3 = ["a","b","c"];
console.log(arr3.slice(2));
console.log(arr3.slice(1,3));
//sort() 排序,是字符串排序,不是数值的排序
var arr31 = [2,3,1,7,2,8];
console.log(arr31.sort());
//数值降序 排序
var arr4 = [3,5,7,6,0,9,11,32 ];
arr4.sort(function (a,b) {
return b-a;
});
console.log(arr4); //[32, 11, 9, 7, 6, 5, 3, 0]
//数值升序 排序
arr4.sort(function (a,b) {
return a-b
});
console.log(arr4); //[0, 3, 5, 6, 7, 9, 11, 32]
//splice(操作位置的小标) 添加/删除指定的成员 “万能函数”
var arr5 = [1,2,3,4,5];
arr5.splice(1,2); //删除两个尘缘
console.log(arr5); //[1, 4, 5]
var arr5 = [1,2,3,4,5];
arr5.splice(1,2,10); //替换
console.log(arr5); //[1, 10, 4, 5]
var arr5 = [1,2,3,4,5];
arr5.splice(1,2,4444,55555,6666); //删除添加
console.log(arr5) ; //[1, 4444, 55555, 6666, 4, 5]
// cancat() 把2个或者多个数组合并
var arr6 = [1,2,3];
var arr7 = [4,5,6];
var ret = arr6.concat(arr7);
console.log(ret); //[1, 2, 3, 4, 5, 6]
//split() 和join() 方法
var arr8 = ["广州","深圳","南山"];
var str = arr8.join("-");
console.log(str); //广州-深圳-南山
var arr9 = "广州-深圳-南山";
console.log(arr9.split("-")) //["广州", "深圳", "南山"]
//find() 高阶函数,返回符合条件的第一个成员
var arr = [4,5,6,7];
var func = (num) =>{
if(num%2===0){
return num;
}
};
var ret = arr.find(func);
console.log(ret); //4
//filter() 对数组的每一个成员进行过滤,返回符合条件的结果
var arr = [4,5,6,7];
function func(num) {
if(num%2===0){
return num;
}
}
var ret = arr.filter(func); //所有的函数名都可以作为参数传递到另一个函数中被执行
console.log(ret); //[4, 6]
//map() 对数组的每一个成员进行处理,返回处理后的每一个成员
var arr = [4,5,6,7];
var ret = arr.map((num)=>{
return num**3;
});
console.log(ret) // [64, 125, 216, 343]
// (14) 其它方法
// includes 查询指定数据是否在数组中存在!
// indexOf() 查询指定数据在数组中第一次出现的位置
// isArray() 判断变量的值是否是数组
</script>
</head>
<body>
</body>
</html>
3.5 for循环
//循环三要素
for (1.声明循环的开始;2.条件;4.循环的计数){
//3.循环条件为true时,会执行这里的代码
}
for (循环的成员下标 in 被循环的数据){
//当被循环的数据一直没有执行到最后下标,都会不断执行这里的代码
}
退出循环
continue //退出当次循环
break //退出当前整个循环
案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
for(var i=0;i<10;i++){
console.log(":",i)
}
var arr = [111,222,333];
for (var i in arr){
console.log(i,":",arr[i])
}
for (var q=0;q<arr.length;q++){
console.log(q,":",arr[q])
}
</script>
</head>
<body>
</body>
</html>
计算1+2+3+...+100的和
计算20的阶乘值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var ret = 0;
for (var i=0;i<=100;i++){
ret = ret + i
}
console.log(ret) //5050
var ret = 1;
for (var i=20;i>0;i--){
ret = ret * i;
}
console.log(ret) //2432902008176640000
</script>
</head>
<body>
</body>
</html>
3.6 while循环
格式
while (循环的条件){
//循环条件为true是,会执行这里的代码
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var count = 0;
while (count < 10){
console.log(count);
count++
}
var counts = 10;
while (counts>0){
console.log(counts);
counts--
}
</script>
</head>
<body>
</body>
</html>
3.7 switch语句
格式
switch(条件){
case 结果1:
满足条件执行的结果是结果1时,执行这里的代码..
break;
case 结果2:
满足条件执行的结果是结果2时,执行这里的代码..
break;
.....
default:
条件和上述所有结果都不相等时,则执行这里的代码
}
switch比else if结构更加简洁清晰,使教程可读性更强,效率更高
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var choice = "1";
switch (choice) {
case "1":console.log("111111");break;
case "2":console.log("222222");break;
case "3":console.log("333333");break;
default:console.log("无效选择!")
}
</script>
</head>
<body>
</body>
</html>
#111111
3.8 if语句
结构
第一种:
if (条件){
//条件为true时,执行的代码
}
第二种:
if (条件){
//条件为true时,执行的代码
}else{
//条件为false时,执行的代码
}
第三种:
if(条件1){
// 条件1为true时,执行的代码
}else if(条件2){
// 条件2为true时,执行的代码
}....
}else{
// 上述条件都不成立的时候,执行的代码
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var is_login = false;
if (is_login){
console.log("hi li")
}else{
console.log("请登录")
}
var login = true;
if (login){
console.log("hi li")
}else{
console.log("请登录")
}
var socre = 98;
if (socre >90){
console.log("成绩优秀")
}else if(socre > 80){
console.log("成绩良好")
}else if(socre > 70){
console.log("成绩一般")
}else if (socre < 60){
console.log("垃圾渣渣")
}
</script>
</head>
<body>
</body>
</html>
3.9 运算符
运算符
//算术运算符
+ 数值相加
- 数值相减
* 数值相乘
/ 数值相除
% 数值求余
** 数值求幂
a++ 数值后自增1 a=a+1
++a 数值前自增1 a=a+1
b-- 数值后自减1 b=b-1
--b 数值前自减1 b=b-1
//赋值运算符
=
+=
-=
*=
/=
%=
**=
//比较运算符,比较的结果要么是true, 要么是false
> 大于
< 小于
>= 大于或者等于
<= 小于或者等于
!= 不等于[计算数值]
== 等于[计算]
!== 不全等[不仅判断数值,还会判断类型是否一致]
=== 全等[不仅判断数值,还会判断类型是否一致]
//逻辑运算符
&& 并且 and 两边的运算结果为true,最终结果才是true
|| 或者 or 两边的运算结果为false,最终结果才是false
! 非 not 运算符的结果如果是true,则最终结果是false ,反之亦然.
//逻辑运算符进阶用法:
1. 实现短路
var a = false || 2 >>> a = 2
var a = true && "hehe" >>> a = "hehe"
2. 快速布尔化[把数据快速转换成布尔类型]
var a = 100
!!a >>> true
//条件运算符[三目运算符]
条件?true:false
例如:
var age = 12;
var ret = age>=18?"成年":"未成年";
console.log(ret);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//++
var x = 10;
var ret = ++x; //先计算在赋值
console.log(ret); //11
console.log(x); //11
var y = 20;
var ret2 = y++; //先赋值再计算
console.log(ret2); //20
console.log(y) //21
//全等于
console.log(2=="2"); //true 会进行暗转换
console.log(2==="2"); //false
//and & 并且
// or | 或者
//not ! 不等于
console.log(2>3 & 2===2); //0
console.log(2>3 | 2===2); //1
console.log(2>3 | !2===2); //0
//and && 并且
// or || 或者
//not ! 不等于
console.log(2>3 && 2===2); //false
console.log(2>3 || 2===2); //true
console.log(2>3 || !2===2); //false
//条件运算符[三目运算符]
var age = 121;
var re = age >= 18 ?"成年":"未成年";
console.log(re) //成年
</script>
</head>
<body>
</body>
</html>
3.10 空值
undefined类型
undefined类型只有一个值,即undefined
1.当声明的变量末初始化时,该变量的默认值是undefined。
2.当函数无明确返回值时,返回的也是undefined
Null类型
另外一种只有一个值的类型是Null,他只有一个专用值null,即它的字面量。值undefined实际上是从值null派生来的,因此ECMAscript把它们定义为相等的。
尽管这两个值相等,但它们的含义不同。undefined是声明了变量但未对其初始化时赋予该变量的值,null则用于表示尚未存在的对象。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null。
3.11 类型转换
js中,类型转换有2种:一种就是强制转换,一种就是自动转换。
因为js是一门弱类型的脚本语言,所以变量会在运算符的运行要求,有时候根据运算符的要求,进行自动转换的。
属性 | 描述 |
---|---|
parseInt() | 把数据转换为整数 |
parseFloat() | 把数据转换成小数 |
Number() | 把数据转换成数值 |
.toString() | 转换数据为字符串 |
String() | 转换数据成布尔值 |
Boolean() | 转换数据成布尔类型 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//parseInt() 把数据类型转换为整数
var box1 = "一共100件"; //转换会失败
var box = "100件"; //转换会成功
var ret1 = parseInt(box1);
var ret2 = parseInt(box);
console.log(ret1); //NaN
console.log(ret2) ; //100
//parseFloat() 把数据类型转换为小数
var t = "3.14";
console.log(parseFloat(t)); //3.14
//Number 把数据转换成数值
//使用Number转换的数据里面必须是纯数字!否则都会转换失败
var num = "3.1.4"; //会转换失败
var num1 = "3.1415"; //会转换成功
console.log(Number(num)); //NaN
console.log(Number(num1)); //3.1415
//转换数据为字符串
//变量.toString()
//String(数据)
var str = 3.14;
var ret = str.toString();
console.log(ret); //3.14
ret = String(str);
console.log(ret) //3.14
//Boolean() 转换数据成布尔类型
var box1 = "";
console.log(Boolean(box1)); //false
var box2 = -1;
console.log( Boolean(box2) ); //true
var box3 = 0;
console.log(Boolean(box3)); //false
var box4 = "false";
console.log(Boolean(box4)); //true
var box5 = [];
console.log(Boolean(box5)); //true
var box6 = {};
console.log(Boolean(box6)); //true
var box7 = "0";
console.log(Boolean(box7)); //true
var box8 = null;
console.log(Boolean(box8)); //false
var box9 = undefined;
console.log(Boolean(box9)) ; //false
</script>
</head>
<body>
</body>
</html>
对于转换数值,如果转换失败的话,则结果为NaN,是not a Number,但是NaN的类型值也是number类型。
自动转换(暗转换)
//所谓的暗转换,其实弱类型中的变量会根据当前代码的需要,进行类型的自动隐式转换。
<script>
//true转换成数值是1,false转换成数值是0
console.log(1+true); //2
console.log(1+"100"); //1100
//程序中+的含义有2种,
第一:两边数值相加;
第二:两边字符串拼接,但是在js中运算符的优先级中,字符串拼接的优先级要高于数值的加减乘除,所以解析器优先使用了+作为字符串的拼接符号了,因为程序需要+号两边都是字符串才能完成运算操作,因此1变成了字符串
"1" + "100"
console.log(1-"200"); //-199
//因为-号中表示的就是左边的数值减去右边的数值,因此程序就会要求"200"是数值,因此内部偷偷的转换了一下。
</script>
3.12 布尔值
1.Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0
2.布尔值也可以看作no/off、yes和no、1/0对应true和false
3.Boolean值主要用于JavaScript的控制语句。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
console.log(true); //true
console.log(false); //false
console.log(typeof true); //boolean
console.log(1 >2); //false
console.log(true == 1); //true
console.log(true === 1); //false
console.log(true+1); //2
console.log(false+1) //1
</script>
</head>
<body>
</body>
</html>
3.13 字符串类型
字符串创建(两钟方式)
变量 = "字符串"
字串对象名称 = new String(字符串)
var str1="hello world";
var str1= new String("hello word");
参数 | 描述 |
---|---|
length | 统计字符串长度 |
toUpperCase() | 字母大写转换 |
toLowerCase() | 字母小写转换 |
indexOf() | 获取指定字符串在字符串中第一次出现的索引位置 |
match() | 正则匹配 |
replace() | 正则转换 |
search() | 正则查找,如果查找不到,则返回-1 |
slice() | 切片,当前方法支持使用负数代表倒数下标 |
split() | 正则分割,经常用于把字符串转换成数组 |
substr() | 截取 |
trim() | 移除字符串首尾空白 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
var s = "hello World!";
//查看字符串长度
console.log(s.length); //12
//将所有字母变大写
console.log(s.toUpperCase()); //HELLO WORLD!
//将所有字母变小写
console.log(s.toLowerCase()); //hello world!
//索引操作
console.log(s[2]); //打印索引2的内容 l
console.log(s.indexOf("llo")); //打印以llo开头的索引位置 2
//正则匹配
var str = "我的电话是:13353575423,你的电话是:17657532666";
var ret = str.match(/\d{11}/g); //全文匹配,连续出现11次的数字,以列表形式显示
console.log(ret); //["13353575423", "17657532666"]
//正则替换 replace()
var str2 = "我的电话是:14325667666";
//正则的捕捉模式 $1..$3 表示的正则中第一个和第二个和第三个小括号捕捉的内容
var ret2 = str2.replace(/(\d{3})(\d{4})(\d{4})/,"$1****$3");
console.log(ret2); //我的电话是:143****7666
//正则查找,返回索引,如果查找不到,则返回-1 search
var str3 = "hello2";
var ret3 = str3.search(/\d/);
var ret3c = str3.search(/\d{2}/);
console.log(ret3); //5
console.log(ret3c); //-1
//切片,开区间,不包含结束下标的内容 slice()
//slice(开始下标) 从开始位置切到最后
//slice(开始下标,结束下标) 从开始下标切到指定位置之前
var str4 = "helloworld";
var ret4 = str4.slice(3.6);
console.log(ret4); //loworld
var ret5 = str4.slice(5);
console.log(ret5); //world
var ret6 = str4.slice(2,-1);
console.log(ret6); //lloworl
var ret7 = str4.slice(-4,-1);
console.log(ret7); //orl
var ret8 = str4.slice(-1,-4); //取不到值,不能倒着取值
console.log("==",ret8); //==
//split 正则分割,经常用于把字符串转换成数组,
var str = "广东-深圳-南山";
var ret = str.split("-"); //以-分割
console.log(ret) // ["广东", "深圳", "南山"]
//substr 截取,从哪个索引开始,取后面几个值
var str = "hello world";
var ret = str.substr(1,3);
console.log(ret); // ell
//trim 移除字符串首尾空白
var password = " ge llo ";
var ret = password.trim();
console.log(ret) //ge llo
console.log(password.length) //10
console.log(ret.length) //6
</script>
</head>
<body>
</body>
</html>
4. function对象
函数在程序中代表的就是一段具有功能性的代码,可以让我们的程序编程更加具有结构性和提升程序的复用性,也能让代码变得更加灵活强大。
声明函数
//1.函数的定义方式
//函数声明
function 函数(参数) {
//函数体;
return 返回值;
}
//函数调用
函数()
功能说明:
可以使用变量、常量或者表达式作为函数调用的参数
函数由关键字function定义
函数名的定义规则与标识符一致,大小写是敏感的
返回值必须使用return
//2.函数的定义方式
用function 类直接创建函数的语法:
var 函数名 = new Function("参数1","参数n","function_body");
函数调用
//f(); --->OK
function f(){
console.log("hello")
}
f() //----->OK
不同于python,js代码在运行时,会分为两大部分--检查装载 和 执行阶段
- 检查装载阶段:会先检测代码的语法错误,进行变量、函数的声明
- 执行阶段:变量的赋值、函数的调用等,都属于执行阶段
函数参数
1.参数基本使用
//位置参数
function add(x,y) {
console.log(x,y)
}
add(2,3); //2 3
add(2,3,4); //2 3
add(2); //2 undefined
//默认参数
function stu_info(name,gender="male"){
console.log("姓名:"+name+" 性别:"+gender)
}
stu_info("li"); //姓名:li 性别:male
stu_info("li","female"); //姓名:li 性别:female
2.函数中的arguments对象
//1.
function addr(a,b) {
console.log(a+b); //21
console.log(arguments.length); //2
console.log(arguments); //[10, 11]
}
addr(10,11);
//2.
function abb() {
var ret = 0;
for (var num in arguments){
ret+=arguments[num]
}
console.log(ret)
}
abb(11,22,33);
//3.
function add() {
console.log(arguments); //[1, 2, 5, 7, 10]
var ret = 0;
for (var i=0;i<arguments.length;i++){
// console.log(i);
ret += arguments[i];
}
console.log(ret) //25
}
add(1,2,5,7,10);
//4.
function f(a,b,c) {
if(arguments.length != 3){
throw new Error("function f called with"+arguments.length+"arguments,but it 3")
}
else {
alert("success!")
}
}
f(1,2,3)
5.匿名函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//匿名函数
var f = function () {
console.log("li")
};
function foo(func) {
func()
};
foo(f); //li
//匿名函数-直接调用
(function () {
console.log("lilili")
})(); //lilili
(function (x,y) {
console.log(x+y)
})(2,4); //6
</script>
</head>
<body>
</body>
</html>
6.函数作用域
作用域是JavaScript最重要的概念之一,
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和声明周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
局部变量,是在函数内部声明,它的生命周期在当前函数被调用的时候,当函数调用完毕后,则内存中自动销毁当前变量。
全局变量,是在函数外部声明,它的生命周期在当前文件中被声明以后就保存在内存中,直到当前文件执行完毕以后,才会被内存销毁掉。
var
//全局变量,再次赋值
var name = "li"; //声明一个全局变量,并赋值
name = "张珊"; //对已经存在的变量重新赋值
console.log(name); //张珊
//全局变量,重新定义全局变量
var gender = "male";
var gender = "female"; //原内存释放与新内存开辟,指针指向新开辟的内存
console.log(gender); //female
作用域案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//全局变量
for(var i=0;i<10;i++){
console.log("ok")
}
console.log(i); //打印10个OK
//全局变量和局部变量
var num = 10; //在函数外部声明的变量, 全局变量
function func() {
// num = 20; // 函数内部直接使用变量,则默认调用了全局的变量,
var num = 20; // 函数内部使用var 或者 let声明的变量则是局部变量
// 函数内部直接使用变量,则默认调用了全局的变量,
// 使用变量的时候,解释器会在当前花括号范围值搜索是否有关键字var 或者let 声明了变量,如果没有,则一层一层往外查找最近的声明
// 如果最终查找不到,则直接报错! 变量名 is not define!
console.log("局部num",num); //局部num 20
}
func();
console.log("全局num: ",num); //全局num: 10
</head>
<body>
</body>
</html>
面试题
var num3 = 10;
function fun3(){
console.log(num3); //undefined
var num3 = 20;
//在加载阶段,程序为num3开辟了作用域空间,但是没有存放任何值为undefined,//
//在执行阶段,代码从上往下执行,在执行到console.log()时,//
//在局部作用域中找到了num3,将局部作用域中的undefined打印了出来,
//再将num3=20 赋值的。
}
fun3();
console.log(num3); //10
作用域链
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其他对象一样,拥有可以通过代码访问的属性和一系列仅供Javascript引擎访问的内部属性,其中一个内部属性是[[scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,他决定了哪些数据能被函数访问,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function bar(age) {
console.log(age);
console.log(sex);
var age = 99;
var sex="male";
console.log(age);
function age(){ //function没有被调用
alert(123);
} ;
console.log(age);
return 100;
}
bar(5)
</script>
</head>
<body>
</body>
</html>
一 词法分析过程(涉及参数,局部变量声明,函数声明表达式):
1-1 、分析参数,有一个参数,形成一个 AO.age=undefine;
1-2 、接收参数 AO.age=5;
1-3 、分析变量声明,有一个 var age, 发现AO 上面有一个 AO.age ,则不做任何处理
1-4 、分析变量声明,有一个 var sex,形成一个AO.sex=undefine;
1-5 、分析函数声明,有一个 function age(){} 声明, 则把原有的 age 覆盖成AO.age=function(){};
二 执行过程:
2-1 、执行第一个 console.log(age) 时,当前的 AO.age 是一个函数,所以输出的一个函数
2-2 、这句 var age=99; 是对不 AO.age 的属性赋值, AO.age=99,所以在第二个输出的age是 99;
2-3 、同理第三个输出的是 99, 因为中间没有改变 age 值的语句了。
注意:执行阶段:
function age(){
alert(123)
} ;
不进行任何操作,将执行语句复制给age这部操作是在词法分析时,即运行前完成的。
7.BOM对象
BOM:broswer object model,即浏览器提供我们开发者在JavaScript用于操作浏览器的对象。
7.1 本地存储对象
使用存储对象的过程中,对象数据会根据域名端口进行保存的,所以js不能获取当前页面以外其他域名端口保存到本地的数据。
也就是说,我们存储对象获取数据只能是自己当前端口或者域名下曾经设置过的数据,一旦端口或者域名改变,则无法获取原来的数据
localStorage 本地永久存储
localStorage.setItem("变量名","变量值"); 保存一个数据到存储对象
localStorage.变量名 = 变量值 保存一个数据到存储对象
localStorage.getItem("变量名") 获取存储对象中保存的指定变量对应的数据
localStorage.变量名 获取存储对象中保存的指定变量对应的数据
localStorage.removeItem("变量名") 从存储对象中删除一个指定变量对应的数据
localStorage.clear() 从存储对象中删除所有数据
sessionStorage 本地会话存储
sessionStorage.setItem("变量名","变量值"); 保存一个数据到存储对象
sessionStorage.变量名 = 变量值 保存一个数据到存储对象
sessionStorage.getItem("变量名") 获取存储对象中保存的指定变量对应的数据
sessionStorage.变量名 获取存储对象中保存的指定变量对应的数据
sessionStorage.removeItem("变量名") 从存储对象中删除一个指定变量对应的数据
sessionStorage.clear() 从存储对象中删除所有数据
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button onclick="func1()">设置一个数据</button>
<button onclick="func2()">查看一个数据</button>
<script>
function func1(){
localStorage.setItem("name","li")
}
function func2(){
var ret = localStorage.getItem("name")
console.log(ret);
}
</script>
</body>
</html>
设置一个数据,存储在浏览器
使用命令获取一个数据
localStorage和sessionstorage的区别:
1.localstorage和sessionstorage一样都是用来存储客户端临时信息的对象
2.他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现)
3.localstorge生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localstorge信息,否则这些信息将永远存在。
4.sessionstorge声明周期为当前窗口或标签页,一旦窗口或者标签页被永久关闭了,那么所有通过sessionstorge存储的数据也就被清空了
5.不同浏览器无法共享localstorge或sessionstorage中的信息。相同浏览器的不同页面间可以相互共享相同的localstorage(页面属于相同域名和端口),但是不同页面或标签之间无法共享sessionstorage的信息。这里需要注意的是,页面及标签页仅指顶级窗口,如果一个标签页包含多个iframe标签且他们属于同源页面,那么他们之间是可以共享sessionstorage的。
7.2 Location(地址栏)对象
参数 | 描述 |
---|---|
protocol | 协议 |
port | 端口 |
hostname | 域名 |
host | 域名:端口 |
pathname | 路径 |
search | 查询字符串 |
hash | 锚点 |
href | 完整的地址信息 |
href | 重新赋值,页面跳转 |
assign | 页面跳转 |
reload | 刷新页面 |
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<title>title</title>
<meta charset="UTF-8">
</head>
<body>
<button onclick="func1()">查看location对象</button>
<button onclick="func2()">跳转到百度</button>
<button onclick="func3()">F5刷新</button>
<script>
function func1(){
console.log(location)
//地址栏对象控制和操作地址栏
//所谓的地址就是当前页面所在的地址
//地址结构:
// 协议://域名:端口/路径/文件名?查询字符串#锚点
console.log(`协议=>${location.protocol}`)
console.log(`端口=>${location.port}`)
console.log(`域名=>${location.hostname}`)
console.log(`域名:端口=>${location.host}`)
console.log(`路径=>${location.pathname}`)
console.log(`查询字符串=>${location.search}`)
console.log(`锚点=>${location.hash}`)
console.log(`完整地址栏信息=>${location.href}`)
}
function func2(){
// location.href="http://www.baidu.com" //页面跳转
location.assign("http://www.baidu.com")
}
function func3(){
location.reload() //刷新页面
}
</script>
</body>
</html>
7.3 Windows对象
1.窗口方法
//BOM browser object model 浏览器对象模型
//js中最大的一个对象,整个浏览器窗口出现的所有东西都是window对象的内容
console.log(window)
//alert() 弹出一个警告框
window.alert("hi,我丢了")
alert("hi,ovo") //简写方法
//confirm 弹出一个确认框,点击确认,返回true,点击取消,返回false
var b = window.confirm("是否继续")
console.log(b)
//prompt() 弹出一个消息输入框,当点击确认以后,则返回可以接受到用户在输入框填写的内容,如果点击取消,则返回null
//var c = window.prompt("请输入一个数字","默认值")
var c = window.prompt("请输入一个数字")
console.log(c)
//打开窗口和关闭窗口
window.open("http://www.baidu.com") //开一个新的窗口
window.open("http://www.baidu.com","_blank","width=800px,height=500px,left=200px,top=200px") //弹出一个新的窗口,并设置窗宽高
//关闭当前浏览器窗口
window.close()
2.定时方法
setInterval()方法会不断地调用函数,直到clearInterval()被调用或窗口关闭。由setinterval()返回的ID值可用作clearInterval()方法的参数,而setTimeout是在指定的毫秒数后调用code一次。
格式
// 设置循环定时器
var ID = window.setInterval(code,millisec) // 每millisec毫秒执行一次code
// 取消循环定时器
window.clearInterval(ID);
// 设置单次定时器
var ID = window.setTimeout(code,millisec) // millisec毫秒后执行code一次
// 取消单次定时器
window.clearTimeout(ID);
其中,code为要调用的函数或要执行的代码串。millisec周期性执行或调用code之间的时间间隔,以毫秒计。
案例
//循环定时:每隔几秒执行函数一次
//直接写函数
var ID = window.setInterval(function(){
console.log("hi")
},2000) //毫秒
clearInterval(ID) //取消循环定时器
//调用函数
function foo(){
console.log("ok")
}
var ID1 = setInterval(foo,2000)
clearInterval(ID1) //取消循环定时器
//计时定时:几秒钟后执行函数一次
var ID2 = setTimeout(foo,2000)
clearTimeout(ID2) //取消计时定时器
定时器案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
function show(){
//构建时间字符串
var now = new Date().toLocaleString();
console.log(now)
//将时间字符串赋值给input标签的value属性(DOM操作)
var ele = document.getElementById("i1")
console.log(ele) //标签对象
ele.value = now //复制value值
}
var ID
function start(){
if (ID === undefined){
show()
//开启定时器
ID = setInterval(show,1000);
}
}
function end(){
clearInterval(ID);
ID = undefined
}
</script>
</head>
<body>
<input type="text" id="i1" value="00:00:00">
<input type="button" value="开始" onclick="start()">
<input type="button" value="结束" onclick="end()">
</body>
</html>
标签:function,console,log,age,JavaScript,ret,var
From: https://www.cnblogs.com/megshuai/p/18517799