正则表达式
今日目标:
1.正则表达式的声明方式
2.正则表达式的基本语法
3.正则表达式的常用方法
00-回顾
# 1. this的指向
// 注意: 一般情况下, this指向的是函数的触发者
`全局环境中的this`: window
function fn() {
console.log(this)
}
window.fn()
`对象方法中的this`: 对象本身
var obj = {
say() {
console.log(this) // obj
}
}
`定时器中的this`: window
setTimeout(function(){
console.log(this) // window
}, 1000)
`事件处理函数中的this`: 事件的绑定者(事件源)
document.onclick = function() {
console.log(this) // document
}
`箭头函数中的this`: 该函数声明时所处的作用域
var obj1 = {
say: () => {
console.log(this) // window
}
}
# 2. 修改this指向的3种方法:
call: 1. 立即执行对应的函数;2.第一个参数是用来修改this指向的,不需要被接收; 3. 可以设置多个参数,每一个形参会错位的依次接收每一个实参
apply: 1. 立即执行对应的函数;2.第一个参数是用来修改this指向的,不需要被接收;3. 只能设置两个参数,第二个参数只能是数组或者伪数组,每一个形参会依次接收每一个数组元素
bind: 1. 不会立即执行对应的函数,而是返回一个修改了this指向的新函数;2. 第一个参数是用来修改this指向的,不需要被接收;3. 可以设置多个参数,每一个形参会错位的依次接收每一个实参
# 3. 解构赋值
// 快捷的从数组或者对象中将需要的数组元素或者属性获取出来
// 注意:解构对象时,变量名必须和属性名一样
var arr = [1,2,3,4]
let [a, b] = arr
var obj = {
uname: '小妲己',
age: 18,
sex: '女'
}
let { age } = obj
# 4. 箭头函数
// 注意: 是函数表达式的替代方案。
// 注意: `箭头函数中的this`: 该函数声明时所处的作用域
const 变量 = () => {}
// 箭头函数可以省略的两个地方:
// 1. 如果有且仅有一个参数,可以将小括号去掉
// 2. 如果函数体内部仅有一行代码,可以将大括号和return关键字去掉
# 5. let,const关键词
// let是var的替代方案
`var和let的区别`:
1. var可以重复声明变量,可能会造成程序问题; let是不能重复声明变量
2. var声明的变量会挂载到window对象上; let声明的变量不会挂载到window对象上的
3. var只有全局和函数作用域; let还具有块级作用域
4. var声明的变量支持变量提升; let声明的变量不支持变量提升
`const常量`:
1. 常量: 不会改变的数据
2. 特点: a. 不能重复声明; b. 必须要有初始值; c. 不能修改值
3. 使用场景:a. js内置的不会改变的属性;b. 函数声明可以用常量接收; c. 程序中预估不会改变的数据
# 6. 函数参数默认值
`作用`:让程序变得更健壮,兼容性更强
`es5语法`:function fn(hero) {
hero = hero || '默认值'
}
`es6语法`:function fn(hero='默认值') {}
# 7. ...展开运算符
`作用`:数组和对象的合并,将伪数组转换为真实的数组
// 注意:合并对象时,如果有相同的属性,后面的会覆盖前面的
var arr = [1,2,3,4]
var arr1 = [5,6]
var arr2 = [...arr, ...arr1]
function fn() {
var newArr = [...arguments]
}
# 8. es6模块化
`模块化`:所有js文件都是一个模块,模块之间就可以相互导入导出
`语法`:先导出,再导入
`分开导出`: 在每一个需要导出的标识符前面添加'export'属性
`导入`: 导入时需要通过对象解构的形式来导入: import { xx, xxx } from '路径'
`一起导出`: 在导出文件的末尾,使用export default { xx, xxx }
`导入`: 导入的时候只能使用变量来接收: import 变量 from '路径'
`在html文件中导入`: <script type="module" src="index.js"></script>
# 9. for...in 和 for...of
`区别`: for...in既可以遍历对象,也可以遍历数组; for...of遍历数组,key值是数组元素
1.正则表达式
1.1 正则的概念和作用
`概念`:是js内置的一个对象
`作用`: 操作字符串。 验证,提取,替换等操作
1.2 正则表达式两种声明方式
// 1. 通过js内置对象来声明
var reg = new RegExp('正则语法')
console.log(reg);
// 2. 通过字面量形式 //
var reg1 = /正则语法/
console.log(reg1);
// test(): 验证字符串是否满足正则表达式
// 返回布尔值:满足 =》 true 不满足 =》 false
console.log(reg1.test('这是一个正则123语法'));
// i : 忽略大小写
// g : 全局
1.3 正则表达式基础语法
// 基本使用
var reg = /abc/
// console.log(reg.test('slkdfj')); //fasle
// console.log(reg.test('ababdca')); // false
// console.log(reg.test('abcabcccda')); // true
// []: 代表多选一
var reg = /[abc]/
// console.log(reg.test('slkdfj')); //fasle
// console.log(reg.test('ababdca')); // true
// console.log(reg.test('a')); // true
// console.log(reg.test('abcabcccda')); // true
// -: 连字符: 起始位置-结束位置
var reg = /[a-z]/
// console.log(reg.test('slkdfj')); //true
// console.log(reg.test('ababdca')); // true
// console.log(reg.test('a')); // true
// console.log(reg.test('abcabcccda')); // true
// console.log(reg.test('!A980')); // false
// [a-zA-Z0-9]: 匹配任意一个字母或数字
// [a-zA-Z0-9_]: 匹配任意一个字母或数字或_
var reg = /[a-zA-Z0-9]/
// console.log(reg.test('slkdfj')); //true
// console.log(reg.test('ababdca')); // true
// console.log(reg.test('789')); // true
// console.log(reg.test('abcabcccda')); // true
// console.log(reg.test('!A980')); // false
// 中括号里面的尖尖:除了0-9以外的任意字符
var reg = /[^0-9]/
// console.log(reg.test('slkdfj')); //true
// console.log(reg.test('ababdca')); // true
// console.log(reg.test('789')); // false
// console.log(reg.test('abcabcccda')); // true
// console.log(reg.test('!A980')); // true
// 限定符:中括号外面的^: 以什么开头
var reg = /^[0-9]/
// console.log(reg.test('1slkdfj')); //true
// console.log(reg.test('ababdca')); // false
// console.log(reg.test('789')); // true
// console.log(reg.test('abcabcccda')); // false
// console.log(reg.test('!A980')); // false
// 限定符:$: 以什么结尾
var reg = /[a-z]$/
// console.log(reg.test('1slkdfj')); //true
// console.log(reg.test('ababdca')); // true
// console.log(reg.test('789')); // false
// console.log(reg.test('abcabcccda')); // true
// console.log(reg.test('!A980')); // false
// 注意:很多场景下,^和$需要一起使用: 仅能匹配任意一位字符
var reg = /^[0-9]$/
// console.log(reg.test('1slkdfj')); // false
// console.log(reg.test('ababdca')); // false
// console.log(reg.test('789')); // false
// console.log(reg.test('7')); // true
/*
量词:
*: 匹配0次以上
+: 匹配1次以上
?: 匹配0-1次
{m}: 精准匹配m次
{m,}: 精准匹配m次以上
{m,n}: 精准匹配m-n次
*/
var reg = /^[0-9]*$/ // 精准匹配任意一个数字0次及以上
// console.log(reg.test('!789')); // false
// console.log(reg.test('789')); // true
// console.log(reg.test('')); // true
var reg = /^[0-9]+$/
// console.log(reg.test('!789')); // false
// console.log(reg.test('789')); // true
// console.log(reg.test('')); // false
// console.log(reg.test('7')); // true
var reg = /^[0-9]?$/
// console.log(reg.test('!789')); // false
// console.log(reg.test('789')); // false
// console.log(reg.test('')); // true
// console.log(reg.test('7')); // true
var reg = /^[0-9]{3}$/ // 精准匹配任意数字3次
// console.log(reg.test('!789')); // false
// console.log(reg.test('789')); // true
// console.log(reg.test('')); // false
// console.log(reg.test('7')); // false
var reg = /^[0-9]{3,}$/ // 精准匹配任意数字3次及以上
// console.log(reg.test('!789')); // false
// console.log(reg.test('789')); // true
// console.log(reg.test('')); // false
// console.log(reg.test('790887')); // true
var reg = /^[0-9]{3,6}$/ // 精准匹配任意数字3次及以上
// console.log(reg.test('!789')); // false
// console.log(reg.test('789')); // true
// console.log(reg.test('1234589')); // false
// console.log(reg.test('790887')); // true
/*
特殊字符:
\d: => [0-9]: 任一数字
\D: 任一非数字
\w: => [a-zA-Z0-9]
\W: 字母数字以外的任一字符
\: 转义符:=》 1. 将普通字符变成有特殊含义的字符; 2. 将有特殊含义的字符转换为普通字符
.: 任一除了换行符之外的字符
(): 代表优先级
|:代表或者
\任意数字: \1: 将第一个小括号的内容重复匹配一次; \2: 将第二个小括号的内容重复匹配一次
*/
var reg = /^abc|def$/ // 匹配以abc开头或者以def结尾的任意字符
// console.log(reg.test('abc'));
// console.log(reg.test('def'));
// console.log(reg.test('abcdef'));
// console.log(reg.test('aabcccdeef'));
var reg = /^(abc|def)$/ // 精准匹配abc或者def
// console.log(reg.test('abc'));
// console.log(reg.test('def'));
// console.log(reg.test('abcdef'));
// console.log(reg.test('aabcccdeef'));
var reg = /^ab(c|d)ef$/
// console.log(reg.test('abc'));
// console.log(reg.test('abd'));
// console.log(reg.test('abcdef'));
// console.log(reg.test('abcef')); true
// console.log(reg.test('abdef')); true
var reg = /^<(p|span)><\/\1>$/
console.log(reg.test('<p></p>')); // true
console.log(reg.test('<span></span>')); // true
console.log(reg.test('<p></span>')); // false
2.表单验证的时机和分类
# 表单验证的3个时机:
1. 失去焦点的时候验证:onblur
2. 边输入边验证: oninput
3. 点击按钮验证: onclick
# 表单验证的两个分类:
前端验证: 用户输入的内容的格式是否满足网站的要求
后端验证: 用户输入的内容是否能在数据库中查到
任务:表格数据和表单提交