【前端】javaScript
目录
JavaScript
什么是JavaScript
-
javaScript 是一门脚本语言
-
遵从ECMAScript规范
-
分为客户端JS和服务端JS
1、基础
1.1、变量
// 变量
// var 变量名 = "初始值"
var userName = "遇见星光";
console.log(userName); // 控制台输出
// 重新赋值,
userName = "yujianxingguang";
console.log(userName); // 控制台输出
1.1、常量
// 常量
// const 常量名 = 值
const FIVE_SECONDS = 5000;
// 常量的值是不允许更改的
// FIVE_SECONDS = 4000
1.1、基本数据类型
// 基本数据类型
var name; // name 为 undefined ,未定义
var password = null; // null ,初始化了值,就是 null
var userName = "遇见星光"; // 字符串
var num = 1314; // 数字,数字类型可以带小数点,也可以不带:
var row = 14.14;
var visble = false; // 布尔 ,只有真和假(false/true
var isNum = true;
// 还有 数组、对象、函数
1.1、数据类型转换
1.1、注释
// 注释
// 单行注释
/*
多行注释
1
2
3
*/
/**
* 文档注释
*
*/
/**
* 对两个参数操作进行加法运算
* @param {number} a 第一个变量
* @param {number} b 第二个变量
* @returns 返回 两个变量之和
*/
function add(a, b) {
return a + b;
}
add() // 调用函数
2、操作符
2.1、赋值操作符
// 赋值操作符 =
var x = 10;
var y = x;
console.log(x, y);
console.clear(); // 清空控制台
2.2、一元操作符
// 一元操作符
var num = -5;
var strNum = +"3";
console.log(strNum, typeof num); // 3 number
strNum++;
strNum--;
++strNum;
--strNum;
2.3、算数操符
// 算数操作符
console.log(1 + 10);
console.log(110 - 10);
console.log(110 * 10);
console.log(110 / 10);
console.log(99 % 9);
console.log(4 ** 2);
2.4、比较操作符
// 比较操作符
console.log(10 ### 5);
console.log(10 < 5);
console.log(10 >= 5);
console.log(10 <= 5);
console.log("5" == 5);
console.log(5 == 5);
console.log(10 === 5); // 类型也要相同
console.log(undefined == null);
console.log(undefined === null);
2.5、逻辑操作符
// 逻辑操作符
// false = false、0、""、null、undefined
console.log(true && true); // 逻辑与
console.log(true && false); //
console.log(true || true); // 逻辑或
console.log(true || false); //
console.log(!true); // 取反
console.log(!false);
console.log(false || "默认值"); // 短路特性
console.log(true || "默认值");
console.log(4);
console.log(!4);
console.log(!!4); // !!4 返回原来 4 所代表的的布尔值
2.6、位运算
// 位运算
// 5 101
// 3 011
console.log(5 & 3); // 与 有一个0 就是 0 001
console.log(5 | 3); // 或 有一个1 就是 1 111
console.log(5 ^ 3); // 异或 相同为 0 不同为 1 110
console.log(~5); // 取反 1=0,0=1;+1 取反 - 5+1
console.log(5 << 1); // << 左移 5:101 1010
console.log(5 >### 1); // >### 左移 5:101 10
console.log(-5 >>### 1); // >>### 无符号左移 5:101
2.7、三目运算
// 三目运算
// a>b ? "a":"b"
var temperature = 10;
console.log(temperature ### 15 ? "出门" : "在家");
3、流程控制
- 语句块
- if……else
- if……else if……else
- switch……case
- while
- do……while
- for
- break和continue
3.1、语句块
// 语句块
{
var UserName = "遇见星光";
console.log(UserName);
let age = 18;
const YEAR = 2021;
}
console.log(UserName); // 遇见星光
// console.log(age); // 未定义
// console.log(YEAR); // 未定义
3.2、if……else
// if……else
var passcode = prompt("请输入密码");
if (passcode == 123456) {
console.log("登录成功");
} else {
console.log("登录失败");
}
4.3、if……else if……else
// if……else if……else
var user = prompt("请输入用户名");
if (user == "admin") {
console.log("超级管理员");
} else if (user == "root") {
console.log("普通管理员");
} else {
console.log("普通用户");
}
3.4、switch……case
// switch……case
var role = prompt("请输入权限");
switch (role) {
case "admin":
console.log("超级管理员");
break;
case "root":
console.log("管理员");
break;
default:
console.log("普通用户");
}
3.5、while
// while
var password = "";
while (password !== "123456") {
password = prompt("输入密码");
}
3.6、do……while
// do……while
var x = 5;
do {
console.log(x++);
} while (x ### 5 && x <= 10);
3.7、for
// for
for (let i = 0; i < 10; i++) {
console.log(i);
}
3.8、break和continue
// break和continue
for (let i = 0; i < 10; i++) {
if (i == 5) {
continue; // 跳过 当先,进行下一次
}
console.log(i);
}
for (let i = 0; i < 10; i++) {
if (i == 5) {
break; // 跳出循环,停止
}
console.log(i);
}
4、函数
4.1、声明函数
// 声明函数
function run() {
console.log("打开冰箱门");
console.log("把大象放进去");
}
function run2(str) {
console.log("打开冰箱门");
console.log("把" + str + "放进去");
}
function numTest(num) {
if (num < 0) return;
return num + 10;
}
function addNum(a, b) {
return a * b;
}
4.2、调用函数
// 调用函数
run();
run2("西瓜");
var num = numTest(5);
num = addNum(5, 5);
num = addNum(numTest(10), 5);
4.3、函数表达式
// 函数表达式
console.log(addNum);
var plus = addNum;
plus(10, 5);
// 匿名函数
var multiply = function (a, bparams) {
console.log(a * b);
};
4.4、变量和函数提升(hoisting)
// 变量和函数提升(hoisting)
x = 5; // 使用前赋值
console.log(x);
var x;
divide(5, 4);
function divide(a, b) {
console.log(a * b);
}
4.5、默认参数
// 默认参数
greetings();
greetings("张三");
function greetings(name = "遇见星光") {
console.log("你好" + name);
}
login(undefined, "123456");
function login(name = "遇见星光", password) {
console.log("你好" + name);
console.log(password);
}
4.6、递归
// 递归
console.log(sum(100));
function sum(n) {
if (n === 1) {
return 1;
}
return n + sum(n - 1);
}
console.log(fib(5));
function fib(num) {
if (num < 1) {
return 1;
}
return fib(num - 1) + fib(num - 2);
}
4.7、arguments
// arguments
log("a01", "a02");
log("a01", "a02", "a03");
function log() {
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
}
4.8、作用域
// 作用域
var x = 5; // 全局
function add(a) {
console.log(a + x);
}
add(10);
4.9、var/let区别
// var/let区别
var z = 6;
if (z ### 2) {
console.log(z);
var num = 17;
}
console.log(num);
4.10、箭头函数
// 箭头函数
var greeting01 = () =### {
console.log("Hello");
};
var greeting02 = (userName) =### {
console.log("Hello" + userName);
};
var greeting03 = (userName, password) =### {
console.log("Hello" + userName + password);
};
greeting01();
greeting02("遇见星光");
greeting03("admin", "12456");
var increment = (x) =### x * 2;
console.log(increment(10));
4.11、闭包
// 闭包
function squareSum(a, b) {
function square(x) {
return x * x;
}
return square(a) + square(b);
}
console.log(squareSum(5, 5));
function person() {
let name = "遇见星光";
function getName() {
return name;
}
return getName;
}
var userName = person();
console.log(userName);
userName = userName();
console.log(userName);
4.12、柯里化
// 柯里化
function addThreeNums(a, b, c) {
return a + b + c;
}
console.log(addThreeNums(5, 8, 10));
// 柯里化函数
function addThreeNumsCurry(a) {
return function (b) {
return function (c) {
return a + b + c;
};
};
}
addThreeNumsCurry(1)(2)(3);
var fixedTwo = addThreeNumsCurry(5)(5); // 把前两个参数保存
fixedTwo(10); // 第三个参数 return 5 + 5 + 10;
fixedTwo(20); // 第三个参数 return 5 + 5 + 20;
4.13、自执行函数
// 自执行函数
var num1 = 10;
(function () {
var num1 = 20;
console.log(num1); // 20
})();
console.log(num1); // 10
4.14、回调函数
// 回调函数
function request(cd) {
console.log("请求数据");
cd("success"); // 回调函数
console.log("请求结束");
}
// function callback(result) {
// console.log("执行回调函数");
// console.log("执行结果 : " + result);
// }
// request(callback);
request((result) =### {
console.log("执行回调函数");
console.log("执行结果 : " + result);
});
5、数组
5.1、创建数组
// 创建数组
var arr1 = [1, 2, 3];
console.log(arr1);
var arr2 = new Array(4, 5, 6);
console.log(arr2);
var arr3 = Array(7, 8, 9);
console.log(arr3);
var arr4 = Array.of(10, 11, 12);
console.log(arr4);
var arrSingle = Array(6);
console.log(arrSingle);
var arrSingle2 = new Array(7);
console.log(arrSingle2);
var arrSingle3 = Array.of(4);
console.log(arrSingle3);
var arrSingle4 = [9];
console.log(arrSingle4);
5.2、访问数组
// 访问数组
var arr = [1, 2, 3];
console.log(arr.length);
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
5.3、添加元素
// 添加元素
var arr = [1, 2, 3];
arr[0] = 4;
console.log(arr);
arr[3] = 5;
console.log(arr);
arr[9] = 5;
console.log(arr);
5.4、删除元素
// 删除元素
var arr = [1, 2, 3];
console.log(arr);
arr.length = 2;
console.log(arr);
arr.length = 0;
console.log(arr);
var arr = [1, 2, 3, 4, 5, 6];
console.log(arr);
arr.splice(2, 1); //arr.splice(索引, 删除元素个数)
console.log(arr);
arr.splice(1, 2, 3, 7, 8); // arr.splice(索引, 删除元素个数,索引后面添加,7 ,8 , )
console.log(arr);
arr.splice(1, 0, 9, 10); // 0 :索引后面添加
console.log(arr);
5.5、数组遍历
// 数组遍历
var arr = [1, 2, 3, 4, 5, 6, 7];
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
console.log("for of");
for (const ele of arr) {
console.log(ele);
}
arr.forEach((ele, index, self) =### {
// 元素,索引,元素本身
console.log(ele, index, self);
});
5.6、栈模式
// 栈模式
var stack = [1, 2, 3, 4, 5, 6];
stack.push(7); // 添加元素
console.log(stack);
stack.push(8, 9, 10);
console.log(stack);
var last = stack.pop(); // 弹出最后一个元素,返回元素的值
console.log(stack);
console.log(last);
console.log(stack[stack.length - 1]);
console.clear();
5.7、队列模式
// 队列模式
var queue = [1, 2, 3];
queue.push(4, 5, 6);
console.log(queue);
var first = queue.shift(); // 弹出第一个元素,返回元素的值
console.log(queue);
console.log(first); // 1
queue.unshift(11, 12, 13); // 数组头部添加元素
console.log(queue);
5.8、反转数组
// 反转数组
var arr = [1, 2, 3, 4, 5, 6];
console.log(arr.reverse()); // 反转数组,返回并改变了数组
console.log(arr);
console.log("hello".split("").reverse().join()); // .split("") 分割字符串
5.9、数组排序
// 数组排序
var arr = [1, 4, 54, 12, 41, 1, 4, 741, 45];
arr.sort();
console.log(arr.sort());
console.log(arr);
// 自定义降序
arr.sort((a, b) => {
if (a > b) {
return -1;
} else if (a < b) {
return 1;
} else {
return 0;
}
});
console.log(arr);
5.10、数组连接
// 数组连接
var arr1 = [1, 2, 3];
var arr2 = [4, 5, 6];
console.log(arr1.concat(arr2));
5.11、数组裁切
// 数组裁切
var arr = [1, 2, 3, 4, 5, 6];
console.log(arr.splice(1));
console.log(arr.splice(1, 4));
console.log(arr.splice(1, -1));
5.12、map数组
// map数组
var arr = [1, 2, 3, 4];
var mappedArr = arr.map((eml) =### eml * 2);
console.log(arr);
console.log(mappedArr);
5.13、reduce数组
// reduce数组
var arr = [1, 2, 3, 4, 5, 6];
var result = arr.reduce((previous, current) =### previous + current, 5); // 5 初始值
console.log(result);
var result = arr.reduce((previous, current) =### previous + current);
console.log(result);
5.14、数组过滤
// 数组过滤
var arr = [1, 2, 3, 4, 5, 6];
var filterredArr = arr.filter((item) =### item ### 4);
console.log(filterredArr);
5.15、数组测试
// 数组测试
var arr = [1, 2, 3, 4, 5, 6];
var result = arr.every((item) =### item ### 5); // 判断所有元素 有一个为假,数组为假
console.log(result);
var result = arr.some((item) =### item ### 5); // 判断元素,有一个为真,数组为真
console.log(result);
5.16、destructuring解构操作符
// destructuring 解构操作符
var arr = [1, 2, 3];
var [a, b, c] = arr;
console.log(a);
console.log(b);
console.log(c);
var user = ["admin", "123456", 18];
var [userName, password] = user;
console.log(userName, password);
var user = ["root", "123456", 18];
var [userName, , age] = user;
console.log(userName, age);
function multipleReturns() {
let userName = "遇见星光";
let positon = "学员";
return [userName, positon];
}
var [myName, myPositon] = multipleReturns();
console.log(myName, myPositon);
5.17、rest 操作符
// rest操作符
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var [a, b, ...rest] = arr;
console.log(a, b, rest);
var [a, , b, ...rest] = arr;
console.log(a, b, rest);
function variousArr(...args) {
console.log(args);
}
variousArr(1, 2, 3, 4);
5.18、多维数组
// 多维数组
var arr = [];
for (let i = 0; i < 5; i++) {
arr[i] = [];
for (let j = 0; j < 4; j++) {
arr[i][j] = i + j;
}
}
console.log(arr);
6、对象
6.1、创建对象
// 创建对象
var employee = {
name: "张三",
age: 18,
posotion: "学员",
singIn: function () {
console.log("张三打卡");
},
};
var employee2 = new Object();
employee2.name = "李四";
employee2.age = 18;
employee2.singIn = function () {
console.log("李四打卡");
};
6.2、对象属性
// 对象属性
console.log(employee.name);
console.log(employee["name"]);
employee.name = "王五";
console.log(employee.name);
employee["name"] = "张三";
console.log(employee.name);
employee.sex = "male";
console.log(employee.sex);
employee3 = {
name: "王五",
"birth-date": "2021-09-01",
birthDate: "2021-09-01",
};
console.log(employee3["birth-date"]);
console.log(employee3.birthDate);
6.3、省略key
// 省略key
var name = "李四";
var employee4 = {
name,
singIn() {
console.log("李四打卡");
},
};
console.log(employee4.name);
console.log(employee4.singIn);
6.4、遍历对象属性
// 遍历对象属性
console.log(Object.keys(employee4));
for (const key in employee4) {
console.log(key);
}
6.5、删除对象属性
// 删除对象属性
delete employee4.name;
console.log(Object.keys(employee4));
6.6、构造函数
// 构造函数
function Employee(name, position) {
this.name = name;
this.position = position;
}
var empl1 = new Employee("遇见星光", "学员");
console.log(empl1);
6.7、this
// this
var empl2 = {
name: "李四",
position: "后端工程师",
signIn() {
console.log(this.name + "上班打卡");
},
};
empl2.signIn();
empl2.goToWord = function () {
console.log(this.name + "去上班");
};
empl2.goToWord();
empl2.goToWord = () =### {
console.log(this.name + "去上班");
};
empl2.goToWord();
6.8、getters和seters
// getters和seters
var person = {
fistName: "三",
lastName: "张",
get fullName() {
return this.lastName + this.fistName;
},
set fullName(fullName) {
console.log(fullName);
[this.lastName, this.fistName] = fullName.split(",");
},
};
console.log(person.fullName);
person.fullName = "李,四";
console.log(person.fullName);
console.log(person.lastName, person.fistName);
// 构造函数
function Employee(name, position) {
this.name = name;
this.position = position;
}
var empl3 = new Employee("遇见星光", "学员");
// 给构造函数 添加 get set:defineProperty(需要添加的对象,"key",{get,set})
Object.defineProperty(empl3, "userInfo", {
get: function () {
return this.name + " " + this.position;
},
set: function (userInfo) {
[this.name, this.position] = userInfo.split(" ");
},
});
console.log(empl3.name, empl3.userInfo);
empl3.userInfo = "遇见星光 后端工程师";
console.log(empl3.name, empl3.userInfo);
6.9、原型
// 原型
function Employee(name, position) {
this.name = name;
this.position = position;
this.singIn = function () {
console.log(this.name + "打卡");
};
}
var empl1 = new Employee("张三", "前端工程师");
var empl2 = new Employee("李四", "后端工程师");
console.log(empl1);
console.log(empl2);
// 函数
console.log(Employee.prototype);
// 增加属性
Employee.prototype.age = 20;
console.log(empl1.age);
console.log(empl2.age);
// 增加方法
Employee.prototype.printInfo = function () {
console.log(this.name, this.age, this.position);
};
empl1.printInfo();
empl2.printInfo();
// 对象 prototype
console.log(empl1.__proto__);
console.log(empl1.__proto__ === Employee.prototype); // true
console.log(Object.getPrototypeOf(empl2));
console.clear();
6.10、object.create()
// object.create()
console.log(empl1);
for (const key in empl1) {
console.log(key);
}
//
var manager = Object.create(empl1);
console.log(manager);
console.log(manager.name, manager.position);
manager.name = "李四";
manager.position = "产品经理";
manager.printInfo();
console.log(Object.getPrototypeOf(manager));
6.12、原型链
// 原型链
var protoOfManager = Object.getPrototypeOf(manager);
console.log(protoOfManager);
var protoOfEmpl1 = Object.getPrototypeOf(protoOfManager);
console.log(protoOfEmpl1);
var protoOfEmpl = Object.getPrototypeOf(protoOfEmpl1);
console.log(protoOfEmpl);
var protoOfObject = Object.getPrototypeOf(protoOfEmpl);
console.log(protoOfObject);
console.log(Object.getPrototypeOf(Object));
console.log(manager.toString);
console.log(manager.toString());
6.13、修改原型指向
// 修改原型指向
function Manager() {}
Manager.prototype.department = "技术部";
Object.setPrototypeOf(manager, Manager.prototype);
console.log(manager.department);
6.14、spread 操作 解构
// spread操作符 解构
var post = {
id: 1,
title: "JavaScript",
content: "对象",
};
console.log(post);
var postClone = { ...post }; // 克隆
console.log(postClone);
console.log(post === postClone);
var post2 = {
...post,
author: "遇见星光",
};
console.log(post2);
var arr = [1, 5, 9];
var arrClone = [...arr, 3, 5, 7];
console.log(arr);
console.log(arrClone);
function savePost(id, title, content) {
console.log("文章 : ", id, title, content);
}
savePost(...[1, "Java", "从入门到放弃"]);
6.15、destructuring&rest
// destructuring & rest
var { id, title } = post;
console.log(id, title);
var { id, title: headline } = post;
console.log(id, headline);
// 添加默认值
var { id, title, comments = "没有评论" } = post;
console.log(id, title, comments);
var [a, b = 2] = [1];
console.log(a, b);
var post3 = {
id: 1,
title: "JavaScript",
content: "对象",
comments: [
{
userId: 1,
comment: "评论1",
},
{
userId: 2,
comment: "评论2",
},
{
userId: 3,
comment: "评论3",
},
{
userId: 4,
comment: "评论4",
},
],
};
var {
comments: [, { comment }],
} = post3;
console.log(comment);
function getId(idKey, obj) {
let { [idKey]: id } = obj;
return id;
}
console.log(getId("userId", { userId: 3 }));
var { comments, ...rest } = post2;
console.log(rest);
function savePostObject(id, title, content, ...rest) {
console.log("文章 : ", id, title, content);
console.log(rest);
}
savePostObject({
id: 4,
title: "java",
content: "从入门到放弃",
author: "遇见星光",
});
6.16、值传递与引用传递
// 值传递与引用传递
function byReference(arr) {
arr[0] = 5;
}
var array = [1, 2, 3];
byReference(array);
console.log(array);
function byReferenceObj(obj) {
obj.title = "默认标题";
}
var post = { id: 1, title: "标题" };
byReferenceObj(post);
console.log(post);
function byReferenceStr(str) {
str = "abc"; // 创建一个新的变量,不改变原有的
}
var testStr = "testStr";
console.log(testStr);
function byValue(num) {
num = 100;
console.log(num);
}
var testNum = 10;
byValue(testNum);
console.log(testNum);
6.17、call & apply & bind
// call & apply & bind
// 改变this指向
var empl = {
id: 1,
name: "遇见星光",
printInfo: function () {
console.log("员工姓名 : ", this.name);
},
department: {
name: "技术部",
printInfo: function () {
console.log("部门名称: ", this.name);
},
},
};
empl.printInfo();
empl.department.printInfo();
function printInfo(dep1, dep2, dep3) {
console.log("员工姓名 : ", this.name, dep1, dep2, dep3);
}
printInfo("技术部", "IT 事业部", "后勤部");
printInfo.call(empl, "技术部", "IT 事业部", "后勤部"); // 绑定对象
printInfo.apply(empl, ["技术部", "IT 事业部", "后勤部"]);
var empPrinInfo = printInfo.bind(empl, "技术部", "IT 事业部", "后勤部");
console.log(empPrinInfo);
7、面向对象
7.1、定义class & 成员方法
// 定义class
class Employee2 {
constructor(name, position) {
this.name = name;
this.position = position;
}
// 成员方法
singIn() {
console.log(this.name, "上课打卡");
}
set info(info) {
[this.name, this.position] = info.split(" ");
}
get info() {
return [this.name, this.position];
}
}
var empl = new Employee2("遇见星光", "学员");
console.log(empl);
empl.singIn();
console.log(empl.info);
7.2、实现继承
// 实现继承
class Manager2 extends Employee2 {
constructor(name, position, dept) {
super(name, position);
this.dept = dept;
}
}
var manager = new Manager2("张三", "前端工程师", "技术部");
console.log(manager);
7.3、成员变量(新
// 成员变量(新
class Employee3 {
dept = "";
constructor(name) {
this.name = name;
}
}
var empl = new Employee3("张三");
console.log(empl);
empl.dept = "技术部";
console.log(empl);
7.4、静态成员
// 静态成员(新
class Page {
static count = 0;
static increaseViewCount() {
Page.count++;
}
}
Page.count++;
console.log(Page.count);
Page.increaseViewCount();
console.log(Page.count);
8、字符串
// 8.1、字符串定义与转义
var str = "hello";
console.log(str);
var str2 = new String("你好");
console.log(str2);
8.1、字符串定义与转义
// 转义
var str = 'TOM:"Hello"'; // "TOM:\"Hello\""
console.log(str);
console.log("Tom\n \t Hello");
console.log("\u4310");
8.2、字符串遍历
// 8.2、字符串遍历
var str = "字符串遍历";
for (let i = 0; i < str.length; i++) {
console.log(str[i]);
}
for (let c of str) {
console.log(c);
}
8.3、字符串裁剪
// 8.3、字符串裁剪
var str = "字符串裁剪";
console.log(str.slice(0, 2));
console.log(str.slice(3, 4));
console.log(str.slice(0, -1));
console.log(str.slice(-6, 1));
console.log(str.substring(0, 4));
console.log(str.substring(4));
console.log(str.substring(0, -1));
8.4、字符串拼接
// 8.4、字符串拼接
var str1 = "hello";
var str2 = "word";
console.log(str1 + str2);
console.log(str1.concat(str2));
8.5、大小写转换
// 8.5、大小写转换
var str = "helloword";
console.log(str.toLocaleUpperCase());
console.log(str.toUpperCase());
8.6、去除空格
// 8.6、去除空格 ,左右两边
var str = " hello word ";
console.log(str.trim());
console.log(str.trimLeft());
console.log(str.trimRight());
8.7、模板字符串
// 8.7、模板字符串
var str = "Hello Word ,Hi Tom";
var longStr = `Hello Word ,Hi
Tom ${str}`;
console.log(str);
console.log(longStr);
function greeting(strings, gender) {
console.log(strings, gender);
var genderStr = "";
if (gender === "M") {
genderStr = "先生";
} else if (gender === "F") {
genderStr = "女士";
}
return `${strings[0]}${genderStr}`;
}
var gender = "M";
var result = greeting`你好 Tom ${gender}`;
console.log(result);
9、正则
9.1、创建正则表达式
// 1、创建正则表达式
var str = "where when what";
var re = /wh/g; // g 全局搜素
var re2 = new RegExp("wh");
console.log(re.exec(str)); // 返回 匹配到的值
console.log(re.exec(str)); // 返回 匹配到的值
console.log(re.test(str)); // 返回 布尔值
console.log(re2.exec(str));
console.log(re2.test(str));
9.2、字符匹配
// 2、字符匹配
var str = `this str contains 123
CAPITALIZED letter and _-&% symbols`;
console.log(/T/.test(str));
console.log(/this/.test(str));
console.log(/thiss/.test(str));
console.log(/12/.test(str));
console.log(/1234/.test(str));
console.log(/_-&/.test(str));
9.3、特殊字符匹配
// 3、特殊字符匹配
var str = `this str contains 123
CAPITALIZED letter and _-&% symbols`;
console.log(str.match(/th.s/g)); // g 全局匹配
console.log(str.match(/1.3/g));
console.log(str.match(/\d/g)); // \d 数字
console.log(str.match(/\w/g)); // \w 字母
console.log(str.match(/\s/g)); // \s 空格 ,换行符
console.log("你好".match(/\u4f60/g));
9.4、匹配次数
// 4、匹配次数
var str = `this str contains 123
CAPITALIZED letter and _-&% symbols`;
console.log(str.match(/this.*/g));
console.log(str.match(/t+/g));
console.log(str.match(/t?/g));
console.log(str.match(/t{2}/g));
console.log(str.match(/\d{1,}/g));
9.5、区间、逻辑和定界符
// 5、区间、逻辑和定界符
var str = `this str contains 123
CAPITALIZED letter and _-&% symbols`;
console.log(str.match(/[abc]/g));
console.log(str.match(/[^a-z]/g));
console.log(str.match(/this|contains/g));
var str = `this str contains this`;
console.log(str.match(/this/g));
console.log(str.match(/^this/g));
console.log(str.match(/this$/g));
console.log(str.match(/\bthis\b/g));
9.6、分组
// 6、分组
var str = `this that this and that`;
console.log(/(th).*(th)/.exec(str));
var str = `aaaab abb cdaa`;
console.log(str.match(/(aa){2}/g));
9.7、常见正则表达式
// 7、常见正则表达式
var mobileRe = /^1[3-9]\d{9}/g;
console.log(mobileRe.test("13345678911"));
var email = /^([a-zA-Z0-9_\-\.].+)@([a-zA-Z0-9_\-\.].+)/g;
console.log(email.test("1810689221@qq.com"));
console.log(email.test("1810689221@qq.com"));
9.8、字符串替换
// 8、字符串替换
var str = "This123 is 123an123 apple";
console.log(str.replace("This", "this"));
console.log(str.replace(/\d/g, ""));
var html = "<p>Hi <span>Tom</span> </p>";
console.log(html.replace(/(<[a-zA-Z]*>)|(<\/[a-zA-Z]*>)/g, ""));
9.9、字符串分割
// 9、字符串分割
var tags = "html, css, JavaScript";
console.log(tags.split(", "));
var str = "this | is , an & apple";
console.log(str.split(/\W+/g)); // /W 非字母
10、内置对象
10.1、Number
// 1、Number
var strNum = "15";
var num = Number.parseInt(strNum);
console.log(strNum);
console.log(num);
console.log(typeof num);
var strNum = "13.14";
var num = Number.parseFloat(strNum);
console.log(num);
console.log(typeof num);
var strNum = "abc";
var num = parseInt(strNum);
console.log(num);
console.log(isNaN(num));
var num = 13.1414151461;
var numStr = num.toFixed(2); // 保留小数点后两位
console.log(numStr);
console.log(Number.MAX_SAFE_INTEGER);
console.log(Number.MAX_VALUE);
console.log(Number.MIN_SAFE_INTEGER);
console.log(Number.NEGATIVE_INFINITY);
10.2、Math
// 2、Math
console.log(Math.PI);
console.log(Math.abs(-6));
console.log(Math.sin(Math.PI / 2));
console.log(Math.floor(3.14));
console.log(Math.ceil(3.14));
console.log(Math.pow(10, 2));
console.log(Math.trunc(10.2));
console.log(Math.trunc(10.8));
console.log(Math.random());
console.log(Math.ceil(Math.random() * 1000));
console.log(Math.trunc(Math.random() * 1000));
10.3、Date
// 3、Date
console.clear();
var date = new Date();
console.log(date);
console.log(date.getFullYear()); // 年
console.log(date.getMonth() + 1); //月
console.log(date.getDate()); // 日
console.log(date.getDay()); // 周几
console.log(date.getHours()); // 小时
console.log(date.getMinutes()); // 分
console.log(date.getSeconds()); // 秒
console.log(date.getTime()); // 时间戳
console.log(date.toLocaleTimeString()); //
console.log(date.toLocaleDateString()); //
date.setFullYear(2022);
console.log(date.toLocaleDateString());
date.setTime(1630662363092);
console.log(date.toLocaleDateString());
10.4、Json对象介绍
// 4、Json对象介绍
var postJSON = `{
"id": 1,
"title": "JavaScript",
"comments": [
{
"userId": 1,
"comment": "从入门到放弃"
},
{
"userId": 2,
"comment": "从入门到放弃"
},
{
"userId": 3,
"comment": "从入门到放弃"
}
],
"published": true,
"author": null
}`;
console.log(JSON.parse(postJSON)); // json 转 对象
var person = {
id: 1,
name: "遇见星光",
skills: ["Java", "HTML"],
};
console.log(JSON.stringify(person, null, 2)); // 对象 转 json
var comments = `[
{
"id": 1,
"name": "遇见星光",
"skills": [
"Java",
"HTML"
]
}
]`;
console.log(JSON.parse(comments));
10.5、Set
// 5、Set 元素不能重复
var set = new Set();
set.add(1);
set.add(5);
set.add(9);
set.add(10);
console.log(set);
set.add(5);
console.log(set);
console.log(set.has(4));
console.log(set.has(5));
set.forEach((value) => {
console.log(value);
});
set.delete(5); // 删除
console.log(set);
set.clear(); // 清空
console.log(set);
var obj1 = { id: 1 };
var obj2 = { id: 2 };
var obj3 = { id: 2 };
set.add(obj1);
set.add(obj2);
set.add(obj3);
console.log(set);
10.6、Map
// 6、Map
var map = new Map();
map.set("id", 1);
map.set("name", "遇见星光");
console.log(map);
console.log(map.get("id"));
console.log(map.has("id"));
// 遍历
map.forEach((key, value) => {
console.log(key, value);
});
var iterator = map.entries();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
for (let [key, value] of map) {
console.log(key, value);
}
// 删除
map.delete("id");
for (let [key, value] of map) {
console.log(key, value);
}
11、异常
11.1、异常介绍
// 1、异常介绍
// console.log(a);
// console.log("这行不会执行");
// var emp = undefined;
// console.log(emp);
// console.log(emp.name);
11.2、捕获异常
// 2、捕获异常
try {
console.log(a);
var emp = undefined;
console.log(emp);
console.log(emp.name);
} catch (err) {
console.log(err);
} finally {
console.log("总会执行");
}
console.log("这行会执行");
11.3、throw抛出异常
// 3、throw抛出异常
function fethDate() {
console.log("获取数据……");
throw 404;
}
try {
fethDate();
} catch (e) {
if (e === 404) {
console.error("未查询到数据");
}
}
11.4、Error对象
// 4、Error对象
// 自定义 错误
class ApiError extends Error {
constructor(url, ...params) {
super(...params);
this.url = url;
this.name = "ApiError";
}
}
function fethDate() {
console.log("获取数据……");
throw new ApiError("/post", "404");
}
try {
fethDate();
} catch (error) {
console.log(error);
console.error(error.name);
console.error(error.message);
}
11.5、捕获多个异常
// 5、捕获多个异常
function fethDate() {
console.log("获取数据……");
console.log(a);
throw new ApiError("/post", "404");
}
try {
fethDate();
} catch (error) {
if (error instanceof ReferenceError) {
console.error("程序异常");
} else if (error instanceof ApiError) {
console.error("Api 异常");
}
}
12、异步
12.1、setTimeout
// 1、setTimeout
console.log("第一行代码");
var timer1 = setTimeout(() => {
console.log("setTimeout() 一秒后执行");
}, 1000);
console.log("第二行代码");
setTimeout(() => {
console.log("timer1:", timer1);
clearTimeout(timer1);
console.log("中断了 timer1 的执行");
}, 500);
12.2、setInterval
// 2、setInterval
var interval = setInterval(() => {
let date = new Date();
console.log(`${date.getHours()}:${date.getHours()}:${date.getSeconds()}`);
}, 1000);
setTimeout(() => {
console.log("interval", interval);
clearInterval(interval);
console.log("停止了 tinterval");
}, 5000);
12.3、创建promise
// 3、创建 promise
var promise = new Promise((resolve) => {
setTimeout(() => {
resolve("执行成功");
}, 2000);
});
12.4、promise完成回调
// 4、promise 完成回调
var promise = new Promise((resolve) => {
setTimeout(() => {
resolve("执行成功");
}, 2000);
});
promise.then((value) => {
console.log(value);
});
12.5、promise异常捕获
// 5、promise 异常捕获
var promise = new Promise((resolve, reject) => {
setTimeout(() => {
// resolve("执行成功");
reject("执行失败");
}, 2000);
});
promise.catch((error) => {
console.error(error);
});
12.6、promise链式调用
// 6、promise 链式调用
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
})
.then((value) => {
console.log(value);
return value + 10;
})
.then((value) => {
console.log(value);
return new Promise((resolve) => resolve(value + 20));
})
.then((value) => {
console.log(value);
});
new Promise((resolve, reject) => {
setTimeout(() => {
// resolve(1);
reject("失败");
}, 1000);
})
.then((value) => {
console.log(value);
return value + 10;
})
.then((value) => {
console.log(value);
return new Promise((resolve) => resolve(value + 20));
})
.then((value) => {
console.log(value);
})
.catch((error) => {
console.error(error);
});
12.7、多个promise同时执行
// 7、多个 promise 同时执行
var p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
});
var p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2);
}, 2000);
});
var p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3);
}, 3000);
});
// 同时执行多个,并返回 Promise对象
Promise.all([p1, p2, p3]).then((value) => {
console.log(value);
});
12.8、async & await
// 8、async & await
// async function async1() {
// setTimeout(() => {
// console.log("async1 执行完毕");
// }, 1000);
// }
async function async2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve(10);
}, 1000);
});
}
async function async3() {
return new Promise((resolve, reject) => {
setTimeout(() => {
// resolve(100);
reject("async3() 执行出错");
}, 1000);
});
}
async function async1() {
let result2 = await async2();
console.log("result2 :", result2);
try {
let result3 = await async3();
} catch (error) {
console.log(error);
}
console.log("result3 :", result3);
}
async1();
// console.log("async1 :", async1()); // Promise 对象
13、模块化
13.1、导出模块
// 1、export 导出模块
/**
*
* @param {Date} date
* @returns
*/
export function formatDate(date) {
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
}
export const DAYS_OF_YEAR = 365;
/**
*
* @param {Date} date
* @returns
*/
function formatDate(date) {
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
}
const DAYS_OF_YEAR = 365;
// 命名方式导出
export { formatDate, DAYS_OF_YEAR }
13.2、导入模块
<script src="./12-模块化.js" type="module"></script>
import { formatDate, DAYS_OF_YEAR } from "./modules/utils.js";
console.log(formatDate(new Date()));
console.log(DAYS_OF_YEAR);
13.3、默认导出
/**
*
* @param {Date} date
* @returns
*/
function formatDate(date) {
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
}
const DAYS_OF_YEAR = 365;
export default formatDate; // 默认导出
导入
import formatDate from "./modules/utils.js";
console.log(formatDate(new Date()));
13.4、别名导入
import formatDate, { DAYS_OF_YEAR as DAYS } from "./modules/utils.js";
console.log(formatDate(new Date()));
console.log(DAYS);
import * as utils from "./modules/utils.js";
console.log(utils.formatDate(new Date()));
console.log(utils.DAYS_OF_YEAR);
/**
*
* @param {Date} date
* @returns
*/
function formatDate(date) {
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
}
const DAYS_OF_YEAR = 365;
export { formatDate, DAYS_OF_YEAR };
14、总结
14.1、总结
- 语法灵活
- 避免争议
- var
- 多种范式
14.2、下一步
- web api
- DOM 操作
- 存储 api
- localstorage
- 地理api
- geolocation
- 前端框架
- vue
- react
- 后端