JavaScript-19
1.正则表达式
- 概述
- 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在JavaScript中,正则表达式也是对象
- 特点
- 灵活性、逻辑性和功能性非常强
- 可以迅速地用极简单的方式达到字符串的复杂控制
- 对刚接触的人来说比较晦涩
- 正则表达式的使用
- 创建正则表达式(1.利用RegExp对象创建 2.利用字面量创建)
- 测试正则表达式 test,用于检验字符串是否符合该规则
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title>正则表达式</title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //正则表达式的使用5555555555555 10 //1.利用RegExp对象来创建 正则表达式 11 var regExp = new RegExp(/123/); 12 console.log(regExp); 13 //2.利用字面量创建 正则表达式 14 var rg = /123/; 15 //3.test()方法用来检验字符串是否符合正则表达式要求的规范 16 console.log(rg.test("123abc")); 17 </script> 18 </body> 19 </html>
- 正则表达式中的特殊字符
- 正则表达式的组成
- 一个正则表达式可以由简单的字符构成,比如/abc/,也可以是简单和特殊字符的结合,例如/a*bc/。其中特殊字符也被称作为元字符,在正则表达式中是具有特殊意义的专用符号,如^、$、+等。
- 边界符:用来提示字符所在的位置
| 边界符 | 说明 |
| ^ | 表示匹配行首的文本(以谁开始) |
| $ | 表示匹配行尾的文本(以谁结束) |
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //边界符 ^ $ 10 var reg = /abc/;//正则表达式里面不需要加引号 不管是数字型还是字符串型 11 // /abc/表示只要包含有abc这个字符串的都返回true 12 console.log(reg.test("aabc")); 13 var reg = /^abc$/;//精确匹配 要求必须是abc字符串才符合规范 14 console.log(reg.test("abcabc"));//false 15 console.log(reg.test("abc"));//true 16 </script> 17 </body> 18 </html>
-
- 字符类
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //1.字符串类:[]表示有一系列字符可供选择,只要匹配其中的一个就可以 10 var reg = /[abc]/;//只要包含a或者包含b或者包含c就返回为true 11 // console.log(reg.test("ekh"));//false 12 // console.log(reg.test("add"));//true; 13 reg = /^[abc]$/; 14 // console.log(reg.test("ahgja"));//三选一只有是a,或是b或是c这三个字母才返回truz 15 //2.方括号内部的范围符 16 reg = /^[a-z]$/; 17 console.log(reg.test("z"));//26个小写英文字母任何一个字母返回true 18 console.log("-------------------------") 19 //3.字符组合 20 reg = /^[a-zA-Z0-9]$/;//大小写都可以 21 console.log(reg.test("Z")); 22 console.log("-------------------------") 23 //4.如果中括号里面包含^是取反的意思 24 reg = /^[^a-zA-Z0-9]$/; 25 console.log(reg.test("!")); 26 </script> 27 </body> 28 </html>
-
- 量词符
| 量词 | 说明 |
| * | 重复零次或更多次 |
| + | 重复一次或更多次 |
| ? | 重复零次或一次 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
- 用户名表单验证
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 <style type="text/css"> 7 div { 8 display: inline-block; 9 } 10 </style> 11 </head> 12 <body> 13 用户名:<input type="text" /> 14 <div></div> 15 <script type="text/javascript"> 16 //如果用户名输入合法,则后面提示信息为:用户名合法,并且颜色为绿色 17 //如果不合法,则提示信息,用户名不符合规范,并且颜色为红色 18 //用户名只能输入英文字母数字或下划线,长度在1 到12 19 var input = document.querySelector("input"); 20 var div = document.querySelector("div"); 21 var reg = /[a-zA-Z0-9_]+/; 22 input.addEventListener("keyup",function(btn){ 23 if(!reg.test(input.value) || input.value.length > 12 || input.value.length < 2){ 24 div.innerText = "用户名不符合规范"; 25 div.style.color = "red"; 26 }else{ 27 div.innerText = "用户名合法"; 28 div.style.color = "green"; 29 } 30 }) 31 </script> 32 </body> 33 </html>
- 括号总结及正则检验工具
- 括号总结
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //大括号 量词符 里面表示重复次数 10 var reg = /^abc{3}$/;//只是让c重复3次 11 console.log(reg.test("abccc")); 12 //中括号 字符集合,匹配方括号中的任意字符 13 var reg = /^[abc]$/; 14 // 表示a也可以,b也可以,c也可以:a||b||c 15 //小括号表示优先级 16 var reg = /^(abc){3}$/;//让abc重复3次 17 console.log(reg.test("abcabcabc")); 18 </script> 19 </body> 20 </html>
- 正则在线检验工具
- 预定义类
| 预定类 | 说明 |
| \d | 匹配0-9之间的任一数字,相当于[0-9] |
| \D | 匹配从0-9之外的字符。相当于[^0-9] |
| \w | 匹配任意的字母、数字和下划线。相当于[a-zA-Z0-9_] |
| \W | 除所有字母、数字、下划线以外的字符,相当于[^a-zA-Z0-9_] |
| \s | 匹配空格,包括换行符、制表符、空格符等,相当于[\r\n\t\v\f] |
| \S | 匹配非空格的字符,相当于[^\r\n\t\v\f] |
- 座机号码验证
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 <style type="text/css"> 7 div { 8 display: inline-block; 9 } 10 </style> 11 </head> 12 <body> 13 <input type="tel" /> 14 <div></div> 15 <script type="text/javascript"> 16 //座机号码验证 17 //格式一:010-12345678 18 //格式二:0530-1234567 19 //正则里面的或者符号| 20 var input = document.querySelector("input"); 21 var div = document.querySelector("div"); 22 var reg = /^\d{3}-\d{8}|\d{4}-\d{7}$/; 23 input.onblur = function(){ 24 if(reg.test(input.value)){ 25 div.innerHTML = "正确"; 26 div.style.color = "green"; 27 }else{ 28 div.innerHTML = "错误"; 29 div.style.color = "red"; 30 } 31 } 32 </script> 33 </body> 34 </html>
- replace替换
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //replace替换 10 //replace可以实现替换字符串的操作,用来替换的参数可以是一个字符串或者是正则表达式 11 //stringObject.replace(regexp/substr,replacement) 12 //第一个参数:被替换的字符串或者正则表达式 13 //第二个参数:替换为字符串 14 //返回值是一个替换完毕的字符串 15 /* 16 正则表达式参数 17 -g:全局匹配 18 -i:忽略大小写 19 gi:全局匹配+忽略大小写 20 */ 21 22 var str = "bbh和bbk"; 23 var res = str.replace(/[\u4e00-\u9fa5]/," and "); 24 console.log(res); 25 </script> 26 </body> 27 </html>
2.ES6
- 简介
- ES6的全称是ECMAScript6,它是由ECMA国际标准化组织制定的一项脚本语言的标准化规范
- let
- ES6中新增的用于声明变量的关键字
- let声明的变量只在所处的块级作用域有效
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 /* 10 let关键字用来声明变量的 11 -let声明的关键字只在块级作用域里有效 12 -在一个大括号中 使用let关键字声明的关键字只在块级有效 13 var声明的关键字不具备此特点 14 -防止循环变量变为全局变量 15 -不存在变量提升 16 -暂时性死区 17 */ 18 // console.log(num);//num is not defined 19 let num = 0; 20 if(true){ 21 let a = 10; 22 // console.log(a);//10 23 if(true){ 24 let c = 56; 25 } 26 // console.log(c);// c is not defined 27 } 28 // console.log(a);//a is not defined 29 console.log("----------防止循环变量变为全局变量---------"); 30 for(let i = 0 ; i < 2 ; i++){}; 31 // console.log(i);//i is not defined 32 console.log("----------暂时性死区---------") 33 //使用let声明的变量与这个块级作用域进行了绑定 34 var flag = 1; 35 if(true){ 36 console.log(flag);// Cannot access 'flag' before initialization 37 let flag = 2; 38 } 39 </script> 40 </body> 41 </html>
- 经典面试题(一)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 var arr = []; 10 for(var i = 0 ; i < 2 ; i++){ 11 arr[i] = function(){ 12 console.log(i); 13 } 14 } 15 //变量i是全局的,函数执行时输出的都是全局作用域下的值 16 arr[0]();//2 17 arr[1]();//2 18 </script> 19 </body> 20 </html>
- 经典面试题(二)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 let arr = []; 10 for(let i = 0 ; i < 2 ; i++){ 11 arr[i] = function(){ 12 console.log(i); 13 } 14 } 15 //每次循环都会产生一个块级作用域,每个块级作用域的变量都是不同的, 16 //函数执行时,是输出自己上一级(循环产生的块级作用域)下的值 17 arr[0]();//0 18 arr[1]();//1 19 </script> 20 </body> 21 </html>
- const
- 声明常量,常量就是值(内存地址)不能变化的量
- 具有块级作用域
- 声明常量时必须赋初始值
- 常量赋值后,值不能修改
- 声明常量,常量就是值(内存地址)不能变化的量
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //1.使用const声明的变量具有跨级作用域 10 if(true){ 11 const a = 10; 12 console.log(a); 13 } 14 // console.log(a);//a is not defined 15 //2.使用const关键字声明常量时必须要赋初始值 16 // const num;//Missing initializer in const declaration 17 //3.使用const声明的常量在赋值之后不能更改 18 const PI = 3.14; 19 // PI = 0.78;//Assignment to constant variable. 20 const arr = [0,1,2]; 21 arr[0] = 3;//不能更改指的是简单数据类型的值和复杂数据类型的地址 22 arr = [0,1,2,3];//Assignment to constant variable. 23 24 </script> 25 </body> 26 </html>
- let、const、var的区别
- 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
- 使用let声明的变量,其作用域在该语句所在的代码块内不存在变量提升
- 使用const声明的变量,在后面出现的代码中不能再修改该常量的值
| var | let | const |
| 函数级作用域 | 块级作用域 | 块级作用域 |
| 变量提升 | 不存在变量提升 | 不存在变量提升 |
| 值可更改 | 值可更改 | 值不可更改 |
- 解构赋值
- ES6中允许从数组中提取值,按照对应的位置,对变量赋值,对象也可以实现解构
- 数组解构
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //数组解构允许我们按照一一对应的关系从数组中提取值 10 //然后将值赋值给变量 11 //如果解构不成功,变量的值为undefined 12 let [a,b,c] = [1,2,3]; 13 console.log(a); 14 console.log(b); 15 console.log(c); 16 let [d,e] = [1]; 17 console.log(d);//1 18 console.log(e);//undefined 19 </script> 20 </body> 21 </html>
-
- 对象解构
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //对象解构允许我们使用变量的名字匹配变量的属性 10 //匹配成功属性的值赋值给变量 11 //写法一: 12 let person = { 13 name: 'bbh', 14 age: 30 15 } 16 // let {name,age} = person; 17 // console.log(name);//bbh 18 // console.log(age);//30 19 //写法二 20 //myname和myage属于别名 21 let {name:myname,age:myage} = person; 22 console.log(myname);//bbh 23 console.log(myage);//30 24 </script> 25 </body> 26 </html>
- 箭头函数
- 箭头函数特点
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //箭头函数是用来简化函数定义语法的 10 /* 11 箭头函数 12 -函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号 13 -如果形参只有一个,则可以省略小括号 14 */ 15 const fn = ()=>{ 16 console.log(1); 17 } 18 fn(); 19 const add = (num1,num2)=> num1+num2; 20 console.log(add(1,2)); 21 const sing = song=>console.log(song); 22 sing("游乐园"); 23 </script> 24 </body> 25 </html>
-
- 箭头函数中的this关键字
- 箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this
- 箭头函数中的this关键字
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 var obj = {name: '张三'}; 10 function fn(){ 11 console.log(this); 12 return ()=>{ 13 console.log(this); 14 } 15 } 16 //箭头函数不绑定this且箭头函数没有自己的this关键字 17 //如果在箭头函数中使用this,this关键字将指向箭头函数中函数定义位置中的this 18 const res = fn.call(obj); 19 res(); 20 </script> 21 </body> 22 </html>
-
- 箭头函数面试题
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //var age = 100; 10 var obj = { 11 age: 20, 12 say: ()=>{ 13 alert(this.age); 14 } 15 } 16 obj.say();//undefined 17 </script> 18 </body> 19 </html>
- 剩余参数
- 剩余参数语法允许我们将一个不定数量的参数表示为一个数组
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //注意:箭头函数中无法使用arguments 10 // function sum(first,...args){ 11 // console.log(first); 12 // console.log(args); 13 // } 14 // sum(1,2,3,56); 15 const sum = (...args)=>{ 16 let total = 0; 17 args.forEach(item => total += item); 18 return total; 19 } 20 console.log(sum(1,2,3,4)); 21 </script> 22 </body> 23 </html>
-
- 剩余参数和解构配合使用
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 let student = ['zhangsan','lisi','wangwu','zhaoliu','sunqi']; 10 let [arg1,...args] = student; 11 console.log(arg1); 12 args.forEach(item=>console.log(item)); 13 </script> 14 </body> 15 </html>
- Array的扩展方法
- 扩展运算符
- 扩展运算符可以将数组或者对象转为用逗号分割的参数序列
- 扩展运算符
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //扩展运算符可以将数组拆分成以逗号分割的参数序列 10 let arr = ['b','a','e','k']; 11 // ...arr;//"b","a","e","k"; 12 //参数中的逗号被当做输出中的,分隔符 13 console.log(...arr); 14 </script> 15 </body> 16 </html>
-
- 扩展运算符的应用
- 合并数组:将多个数组进行合并
- 展开语法:将伪数组转换为真正的数组
- find():找出第一个符合条件的数组成员
- findIndex():找到第一个符合条件的数组成员的索引号
- includs():表示数组中是否包含某个给定的值,返回bool值
- 扩展运算符的应用
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <ul> 9 <li></li> 10 <li></li> 11 <li></li> 12 <li></li> 13 <li></li> 14 <li></li> 15 </ul> 16 <script type="text/javascript"> 17 //扩展运算符的应用 18 //1.合并数组 19 let arr1 = [1,2,3]; 20 let arr2 = [4,5,6]; 21 //方法1 22 // let arr3 = [...arr1,...arr2]; 23 //方法2 24 arr1.push(...arr2); 25 console.log(arr1); 26 //2.展开语法:将类数组或可遍历对象转换为真正的数组 27 var li = document.querySelectorAll("li"); 28 //方法一: 29 // let lis = [...li]; 30 // console.log(lis); 31 //方法二:Array.from()第二个参数,提供了伪数组中数据的方法 32 let newArr = Array.from(li,item=>item.innerText=1); 33 console.log(newArr); 34 //3.find()找到第一个符合条件的数组成员 35 let arr = [{ 36 id: 1, 37 name: 'bh' 38 },{ 39 id: 2, 40 name: 'bk' 41 },{ 42 id: 3, 43 name: 'os' 44 }] 45 var res = arr.find(item=>item.id == 4); 46 console.log(res);//有就返回找到的值,没有则返回undefined 47 //4.findIndex()找到第一符合条件的数组成员的索引号 48 res = arr.findIndex(item=>item.id==1); 49 console.log(res);//如果找到就返回index值,没有则返回-1 50 //5.includes()表示某个数组中是否包含给定的值,返回布尔值 51 var arrs = ['bh','bbk','bbh','1',false]; 52 console.log(arrs.includes(false)); 53 </script> 54 </body> 55 </html>
- String的扩展方法
- 模板字符串:ES6新增的创建字符串的方式,使用反引号定义,可以解析变量
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //模板字符串 10 let name = `这是一个模板字符串`; 11 console.log(name); 12 //1.模板字符串可以解析变量 13 let singer = `Jane`; 14 let say = `${singer} I want love`; 15 console.log(say); 16 //2.模板字符串可以换行 17 var l = ` 18 I've 19 hopping 20 you 21 were 22 heaven 23 sent 24 `; 25 console.log(l); 26 //3.在模板字符串中可以调用函数,直接显示函数返回值 27 const fn = () => { 28 return '我是函数'; 29 } 30 let html = `我是啥呀? ${fn()}`; 31 console.log(html) 32 </script> 33 </body> 34 </html>
-
- startsWith():表示参数字符串是否还在原字符串的头部,返回布尔值
- endsWith():表示参数字符串对否在原字符串的尾部,返回布尔值
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 let str = 'when the sun is at the highest point'; 10 console.log(str.startsWith('when'));//true 11 console.log(str.endsWith('point'));//true 12 </script> 13 </body> 14 </html>
-
- repeat():将原字符串重复n次,返回一个新的字符串
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 let x = 'love '; 10 console.log(x.repeat(3)); 11 </script> 12 </body> 13 </html>
-
- 字符串补全
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //padStart():返回新的字符串,表示用参数字符串从头部(左侧)补全字符串 10 //padEnd():返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串 11 //第一个参数是指定生成字符串的最小长度,第二个参数是用来补全的字符串 12 console.log("love".padStart(5,"I")); 13 console.log("love".padEnd(7,"you")); 14 //如果指定的长度小于或者等于原字符串长度,则返回原字符串 15 console.log("love".padStart(4,"I")); 16 //如果原字符串叫上补全字符串长度大于指定长度,则截去超出位数的补全字符串 17 console.log("love".padEnd(8,"thw world")) 18 </script> 19 </body> 20 </html>
- Set数据结构
- ES6提供了新的数据结构Set,它类似于数组,但是成员的值都是唯一,没有重复的值。
- Set用来数组去重
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 //Set:本身是一个构造函数,用来生成Set数据结构 10 //Set函数可以接受一个数组作为初始值,用来初始化 11 const s = new Set(); 12 console.log(s.size);//0 13 const s2 = new Set([1,2,3,4]); 14 console.log(s2.size);//4 15 //1.Set集合可以被用来数组去重 16 const s3 = new Set([1,1,1,2,2,2]); 17 console.log(s3);//{1,2} 18 </script> 19 </body> 20 </html>
-
- Set实例方法
- add(value):添加某个值,返回Set结构本身
- dalete(value):删除某个值,返回一个布尔值,表示删除是否成功
- has(value):返回一个布尔值,表示该值是否为Set的成员
- clear():清除所有成员,没有返回值
- Set实例方法
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 const s = new Set(); 10 //1.从set结构中添加值,add可以链式调用 11 s.add(1).add(2); 12 console.log(s); 13 //2.从set结构中删除值,用到的方法时delete 14 var res = s.delete(1); 15 console.log(res);//返回的布尔值表示是否成功删除 16 console.log(s); 17 //3.判断一个值对否是set数据结构的成员 使用has 18 res = s.has(2); 19 console.log(res);//true 20 //4.清空set数据结构中的值,使用clear方法 21 s.clear(); 22 console.log(s); 23 </script> 24 </body> 25 </html>
-
- 遍历set数据结构
- Set结构的实例和数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值
- 遍历set数据结构
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 const s = new Set(); 10 //1.从set结构中添加值,add可以链式调用 11 s.add(1).add(2); 12 console.log(s); 13 //2.从set结构中删除值,用到的方法时delete 14 var res = s.delete(1); 15 console.log(res);//返回的布尔值表示是否成功删除 16 console.log(s); 17 //3.判断一个值对否是set数据结构的成员 使用has 18 res = s.has(2); 19 console.log(res);//true 20 //4.清空set数据结构中的值,使用clear方法 21 s.clear(); 22 console.log(s); 23 </script> 24 </body> 25 </html>

浙公网安备 33010602011771号