一、正则表达式
- 正则的创建
- 字面量创建 /匹配的字符串/
- 实例化对象 new RegExp('匹配的字符串')
const reg1 = /good/ ;
const reg2 = new RegExp('good') ;
- 正则的修饰符
- i ignore 忽略大小写
const reg1 = /tmd/i ;
- g global 全局匹配
const reg2 = /tmd/g ;
- 构造函数的第一个参数表示匹配的字符,第二个参数表示修饰符
const reg3 = new RegExp('tmd' , 'gi') ;
- 正则的方法
- test() 测试字符串中是否有匹配正则的内容,返回布尔值 一般此正则不需要全局匹配
const reg = /tmd/ig ;
const str = 'hello tmd tMd' ;
console.log(reg.test(str)
- exec() 返回的是一个数组 --- 总是匹配一个 , 如果匹配不到就返回null
const reg = /tmd/ig ;
const str = 'hello tmd t】tMd' ;
console.log(reg.exec(str));
- 补充知识点 []转为布尔值是-> true
- 正则的语法
- | 或者
const reg2 = /0|1|2|3|4|5|6|7|8|9/ ;
- [] 或者(区间) [0-9] [1-9] [a-z] [A-Z] [0-9a-zA-Z]
const reg = /[0-9]/ ;
- 空格也会被匹配 --- 一般正则不写空格
- 正则的元字符
* 0次或者多次 {0 , } const reg4 = /da*y/ ; // /d要么有a,要么没有a,不能有其他的字符y/
? 0次或者1次 {0 , 1} const reg6 = /da?y/ ; //dy day
+ 1次或者多次 {1 , } const reg5 = /da+y/ ; // day daay daa...y
{m , n} m次到n次 const reg7 = /da{2,5}y/ ; // a匹配2次到5次
{m , } 至少m次
{m} m次 console.log(/da{2}/.test('daay'));
- ^ 以...开头
- $ 以...结尾
- ^ $ 同时使用可以把正则规定死
- . 匹配任意字符
const reg = /^.{3,6}$/ ;
- 转义字符串
- 匹配 /
const reg = /\\\// ;
- 匹配 .
const reg2 = /\./ ;
- 匹配 [
const reg3 = /\[/ ;
- \d 数字
- \D 非数字
- \w 数字,字母,下划线 [0-9a-zA-Z_]
- \W 非数字,字母,下划线
- \s 匹配空白字符
- \S 匹配非空白字符
- 空字符 .{0} 注意:空白字符和空字符不一样
- [\u4e00-\u9fa5]
const reg = /^[\u4e00-\u9fa5]{3,6}$/ ;
- 字符串使用到正则的方法
- replace(要查找的,替换的) 默认只会替换一次,因此需要正则
- search() 一般和indexOf是一样的,但是search还可以接受正则
const str2 = 'good daay Daay up' ;
console.log(str2.search('day'));
console.log(str2.search(/da*y/gi));
console.log(str2.match('a'));
- match() 找到满足条件的字符,默认只会找到第一个,全局匹配才能找到所有的,如果找不到就返回null
- split() 把字符串切割成数组,也可以接受正则的写法
const str3 = 'good good study day day up' ;
console.log(str3.split(/ +/));
- 敏感词替换,使用replace()方法
function replaceMinGan(str , arr , n) {
n = n || '**' ;
const word = arr.join('|') ;
const reg = new RegExp(word , 'ig') ;
return str.replace(reg , n)
}
const mgc = ['tmd' , 'md' , 'wc'] ;
const res = replaceMinGan('wc,正则真tmd简单啊,Wc' , mgc ) ;
console.log(res);
- 常见正则练习
const reg = /^[\w,\+]+@\w+\.(com|cn|com\.cn)$/
console.log(reg.test('cn'));
const reg2 = /^\d{17}[\dX]$/ ;
const reg3 = /^\d{6}(19|20)\d{2}(0|1)\d(0|1|2|3)\d\d{3}[\dX]$/ ;
console.log(reg3.test('111111192111511114'));
const str = ' good good study day day up ' ;
console.log(str.replace(/ +/g , ''));
console.log(str);
console.log(str.replace(/^ +| +$/g , ''));
console.log(str.replace(/ +/g , ' '));
二、SE6语法
- 变量声明的方式
- let 和 const
- 块级作用域,先声明后使用
- 在同一个作用域下,变量名不允许重复
- 他们声明的全局变量并没有挂在 window对象上
- 都没有预编译
- let 声明的变量值可以改变
- const 声明的变量值不能改变
- const 必须声明后立即赋值 const a = 3.14;
- const 存引用数据类型时,内容可以发生改变(地址不能改变)
- 优先考虑使用const , 如果变量会发生改变,就使用let , 最后使用var
- 模板字符串
`${}`
- 数组的解构
const arr = [1,2,3] ;
const [a , b , c] = arr ;
console.log(a , b , c);
const [c , , d] = arr ;
console.log(c , d);
const arr2 = [1,2,[3,4]] ;
const [a,b,c] = arr2 ;
console.log(c);
const [a,b,[c]] = arr2 ;
console.log(c);
let a = 2 ;
let b = 1 ;
[a , b] = [b , a] ;
console.log(a , b);
- 对象的解构
const obj = {
name : 'yy' ,
age : 18 ,
say : function () {
console.log(this.name);
}
}
const {name : a , age : b , weight : c , say : fn} = obj ;
console.log(a);
const {a:a,b:b,c:c} = {a:1 , b:2 , c:3} ;
console.log(a , b , c)
简写:当变量名和属性名相同时候可以简写
const {name : name , age : age , say : say} = obj3 ;
简写为
const {name , age , say} = obj3 ;
console.log(name , age , say);
- 展开运算符
- 展开运算符:...
- const arr2 = [...arr]
const obj = {a:1 , b:2 , c:3} ;
const obj2 = {...obj , name : 'cc'} ;
console.log(obj2);
- 箭头函数
- 具名函数也有预编译,赋值式函数没有预编译
- 只有匿名函数可以改写成箭头函数
const fn = () => {
console.log(999);
}
- 形参有且只有一个的时候,省略小括号
const fn = n => {
console.log(n);
}
- 当函数体只有一句代码且有返回值的时候 , 省略大括号和return
const fn = n => ++n;
- 箭头函数中没有arguments
- 使用展开运算符接受实参 ...arr 得到的是一个真数组
箭头函数的this指向问题
- 在事件处理函数中,this指向绑定事件的这个对象
- 在普通函数中,this指向window
- 在对象中,this指向对象本身
- 在严格模式下,this没有指向 undefined
- 箭头函数没有自己的this指向,父元素指向谁,箭头函数的this就指向谁
- 因为在函数中this的指向可以发生改变,使用箭头函数就保持住了this的指向
- 箭头函数的作用 --- 没有自己的this指向 父元素指向谁,箭头函数就指向谁
- 扩展函数
function fn() {
const a = 1 ;
const b = 2 ;
return [a , b]
}
function fn2() {
const c = 3 ;
return function () {
console.log(c);
}
}
const res = fn2() ;
res() ;
function fn(a = 0 , b = 0) {
return a + b
}
三、严格模式
- js语法的弊端
- 不加分号
- 变量的数据类型可以任意改变
- 预编译
- 同一个变量名可以被反复的声明
- ES5 严格模式 'use strict' ;
- 变量必须先声明后使用
- 函数中不允许形参同名