From ae8d7dd1f82332c711a87bc6b6b2390d8fd83706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 02:37:00 +0000 Subject: [PATCH 01/13] =?UTF-8?q?=E6=96=B0=E5=BB=BA=202022-11-01=20Class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\347\254\224\350\256\260/2022-11-01 Class/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-01 Class/.keep" diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-01 Class/.keep" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-01 Class/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 55c3d76693f63e3c9c096d704a63d266b9a5218a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 02:37:23 +0000 Subject: [PATCH 02/13] =?UTF-8?q?=E6=96=B0=E5=BB=BA=202022-11-01=20?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-11-01 \344\275\234\344\270\232/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232/.keep" diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232/.keep" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 20ecdf3568e6133e10efad573413e766fe70b415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 04:07:39 +0000 Subject: [PATCH 03/13] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 何睿 <2476310189@qq.com> --- .../2022-11-01 \344\275\234\344\270\232.md" | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 "06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232.md" diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232.md" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232.md" new file mode 100644 index 0000000..f866b9e --- /dev/null +++ "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232/2022-11-01 \344\275\234\344\270\232.md" @@ -0,0 +1,134 @@ +```javascript + // function fun(n,o) { + // console.log(o); + // return{ + // fun: function(m) { + // return fun(m,n) + // } + // } + // } + + // var a=fun(0);//undefined + // a.fun(1);//0 + // a.fun(2);//0 + // a.fun(3);//0 + // var b=fun(0).fun(1).fun(2).fun(3);// undefined 0 1 2 + // var c=fun(0).fun(1);//undefined 0 + // c.fun(2);//1 + // c.fun(3);//1 + + +// 编写一个类和类继承,类名为Person,属性name,age,方法sayHello. +// 一个Student类,继承自Person,自有属性score,自有方法study + +// 请使用 原型链 构造函数继承 圣杯模式 class继承分别实现 + +// 原型链 +// function Person(name,age) { +// this.name=name; +// this.age=age; +// } + +// Person.prototype.sayHello=function() +// { +// console.log("我是Person"); +// } +// function Student(score) { + +// this.score=score; +// } + +// Student.prototype.study=function() +// { +// console.log("我是study"); +// } + +// Student.prototype=new Person('猴子',18) +// // Student.prototype=Object.create(Person.prototype) + +// var s=new Student(89) + +// console.log(s.name); + +// class +// class Person { +// constructor(name,age) +// { +// this.name=name; +// this.age=age; +// } +// sayHello(){ +// console.log("我是Person"); +// } + +// } +// class Student extends Person{ + +// constructor(name,age,score) +// { +// super(name,age) +// this.score=score; +// } +// study(){ +// console.log(this.name); +// } +// } +// var p=new Person(); +// var s=new Student('猴子',18,89); +// s.study() +// 构造函数继承 +// function Person(name,age) { +// this.name=name; +// this.age=age; +// this.sayHello=function() +// { +// console.log("我是Person"); +// } +// } + +// function Student(score,name,age) { + +// this.score=score; +// Person.call(this,name,age) +// this.study=function() +// { +// console.log("我是study"+this.name); +// } +// } +// var s=new Student(89,'猴子',18) +// s.study(); +// console.log(s.name); +// 圣杯模式 +function Person(name,age) { + this.name=name; + this.age=age; +} +Person.prototype.name ='猴子' +Person.prototype.age=18 +Person.prototype.sayHello=function() +{ + console.log("我是Person"); +} +function Student(score) { + + this.score=score; +} + + +function inherit(c,s) { + function f() {} + f.prototype = s.prototype + c.prototype = new f() + c.prototype.constructor= c + c.prototype.uber = s.prototype; +} +inherit(Student,Person) +Student.prototype.study=function() +{ + console.log("我是study"+this.name); +} +var p = new Person() +var s=new Student(89) +s.study() +``` + -- Gitee From 008a3d0f1480201318357973652f5dfe18197dba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 05:14:44 +0000 Subject: [PATCH 04/13] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 何睿 <2476310189@qq.com> --- .../2022-11-01 \347\254\224\350\256\260.md" | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 "06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-01 Class/2022-11-01 \347\254\224\350\256\260.md" diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-01 Class/2022-11-01 \347\254\224\350\256\260.md" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-01 Class/2022-11-01 \347\254\224\350\256\260.md" new file mode 100644 index 0000000..a377ba9 --- /dev/null +++ "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-01 Class/2022-11-01 \347\254\224\350\256\260.md" @@ -0,0 +1,190 @@ +## 一,进阶圣杯模式 + +* 在立即执行函数里返回圣杯模式 + +```js + function Person() {} + function Student() {} + var inherit = (function() { + return function(Target, Origin) { + function f() {} + f.prototype = Origin.prototype; + Target.prototype = new f(); + Target.prototype.constructor = Target; + } + }()) + inherit(Student, Person); + var person = new Person(); + Person.prototype.name = 'ABC'; + Person.prototype.age = 20; + Person.prototype.sayHello = function() { + console.log('你好,我叫' + this.name + "今年" + this.age + "岁了"); + } + person.sayHello(); + + var student = new Student(); + Student.prototype.score = 81; + Student.prototype.study = function() { + console.log('我的考试成绩是' + this.score + '分'); + } + console.log(student.name); + student.study(); + student.sayHello(); +``` + + + + + +### 二,class语法糖 + +* 基于原型和原型链, 默认在use strict(严格模式) 的模式下进行的 +* 子类通过extends继承父类,继承时一定要有super()函数 +* super函数的作用就是继承父类的属性 + +```js +//父类 +class Shape{ + constructor(){ //装属性的空间 + this.pro = '图形'; + } + //自定义Draw方法 + Draw(){ + console.log('我是一个图形'); + } +} +//子类 +class Circle extends Shape{ + constructor(center,r){//center与r是传进来的参数 + super(); //必填 + this.r = r; + this.x = center[0];//把center当做数组,x是下标为0的center数组的值 + this.y = center[1]; + } + //自定义getArea方法 + getArea(){ + return (Math.PI*this.r*this.r).toFixed(2); //保留小数几位 + } + //更改x,y的值用move + move(x,y){ + this.x += x; + this.y += y; + } + //自定义方法输出 + position(){ + console.log('我的位置在'+this.x+','+this.y); + } +} + +var circle =new Circle([0,0],5); +console.log(circle.getArea()); +console.log(circle.pro); +circle.position(); +circle.move(5,5); +circle.position(); +``` + + + + + + + +### 三,链式调用 + +* 每一个方法都要返回(return this) +* 输出可以直接接着点出这个方法 + +```js +var plan = { + mon: function () { + console.log('吃饭'); + return this; + }, + tue: function () { + console.log('睡觉'); + return this; + }, + wed: function () { + console.log('打豆豆'); + return this; + }, + thu: function () { + console.log('学习'); + return this; + }, + fri: function () { + console.log('锻炼'); + return this; + }, + sat: function () { + console.log('逛街'); + return this; + } +} +//输出 +plan.mon().tue().wed().thu().fri().sat(); +``` + +​ + + + +### 四,for in 与 for of 的区别 + +#### 1,for of(遍历属性对应的值,没有key) + +```js +for (let e of[1, 2, 34, 4, 5]) { + console.log(e); + } +``` + +#### 2,for in (遍历键值对,key,value) + +* 输出顺序不固定 + +```js +var obj ={ + 'No1' : '第一', + 'No2' : '第二', + 'No3' : '第三' +} +for(let e in obj){ + console.log(e+':'+obj[e]); +} +//输出'No1' : '第一', + // 'No2' : '第二', + // 'No3' : '第三' +``` + + + + + +### 五,in 和 hasownProperty() 的用法 + +#### 1,in(可以找自己的属性和原型里面的属性) + +```js +var obj = { + name:'周飘', + age:18 +} +obj.__proto__.gender = '女'; + + console.log('name' in obj); //true + console.log('gender' in obj); //true +``` + +#### 2,hasOwnProperty()(只能找自己的属性,找不到原型里面的属性) + +```js +var obj = { + name:'周飘', + age:18 +} +obj.__proto__.gender = '女'; + console.log(obj.hasOwnProperty('name'));//true +console.log(obj.hasOwnProperty('gender'));//false +``` \ No newline at end of file -- Gitee From 40b3ef036d1d0fa52936341b08559a16e84f5196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 14:18:20 +0000 Subject: [PATCH 05/13] =?UTF-8?q?=E6=96=B0=E5=BB=BA=202022-11-02=20?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-11-02 \344\275\234\344\270\232/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232/.keep" diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232/.keep" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 1d19bf9d20ddd95fea7a1073ef046eb21cc6ee00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 14:18:34 +0000 Subject: [PATCH 06/13] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 何睿 <2476310189@qq.com> --- .../2022-11-02 \344\275\234\344\270\232.md" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 "06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232.md" diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232.md" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232.md" new file mode 100644 index 0000000..2001eba --- /dev/null +++ "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232/2022-11-02 \344\275\234\344\270\232.md" @@ -0,0 +1,48 @@ +```javascript + // function foo(b) { + // this.a = b; + // } + // var obj1 = {}; + // var bar = foo.bind(obj1); + // bar(2); + + // console.log(obj1.a);//2 + // var baz = new bar(3); + // console.log(obj1.a);//2 + // console.log(baz.a);//3 + + + // var name = 'window'; + // var obj1 = { + // name:'1', + // fn1:function (){ + // console.log(this.name);//1 + // }, + // fn2:()=>console.log(this.name),//window + // fn3: function (){ + // return function (){ + // console.log(this.name);//1 + // } + // }, + // fn4: function(){ + // return () => console.log(this.name);//window + // } + // }; + // var obj2 = { + // name: '2' + // }; + // obj1.fn1();//1 + // obj1.fn1.call(obj2);//2 + + // obj1.fn2();//window + // obj1.fn2.call(obj2);//window + + // obj1.fn3()();//window + // obj1.fn3().call(obj2);//2 + // obj1.fn3.call(obj2)();//window + + // obj1.fn4()();//1 + // obj1.fn4().call(obj2);//1 + // obj1.fn4.call(obj2)();//2 +``` + -- Gitee From 3f8c5913600d2f46574580c475d65e29ff15adba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 14:18:52 +0000 Subject: [PATCH 07/13] =?UTF-8?q?=E6=96=B0=E5=BB=BA=202022-11-02=20this?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-11-02 this\345\257\271\350\261\241/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-02 this\345\257\271\350\261\241/.keep" diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-02 this\345\257\271\350\261\241/.keep" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-02 this\345\257\271\350\261\241/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From f4abd1dca3e8641f1170584099e098142046f1d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Wed, 2 Nov 2022 14:19:02 +0000 Subject: [PATCH 08/13] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 何睿 <2476310189@qq.com> --- .../2022-11-02 \347\254\224\350\256\260.md" | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 "06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-02 this\345\257\271\350\261\241/2022-11-02 \347\254\224\350\256\260.md" diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-02 this\345\257\271\350\261\241/2022-11-02 \347\254\224\350\256\260.md" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-02 this\345\257\271\350\261\241/2022-11-02 \347\254\224\350\256\260.md" new file mode 100644 index 0000000..e20b6da --- /dev/null +++ "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-02 this\345\257\271\350\261\241/2022-11-02 \347\254\224\350\256\260.md" @@ -0,0 +1,173 @@ +# 一.this对象 + +this对象在js中是一个特殊的存在 它总是指向它所属的对象,它拥有的不同的值取决于它的不同的位置,一般情况下有一下几种: + +``` +在方法中this所指的是其所有者的对象,一般用来建造构造函数。 +在单独使用的情况下,this一般指的全局对象,一般都是浏览器对象window。 +在函数中 this指的也是全局对象一般也都是浏览器对象window。 +在严格模式下 this一般是undefined。 +在事件中,一般是接收事件元素的对象。 +``` + +### this默认绑定 + +this默认绑定我们可以理解为函数调用时无任何调用前缀的情景,它无法应对我们后面要介绍的另外四种情况,所以称之为默认绑定,默认绑定时this指向全局对象(非严格模式):在严格模式环境中,默认绑定的this指向undefined + + + +```javascript +function fn1() { + let fn2 = function () { + console.log(this); //window + fn3(); + }; + console.log(this); //window + fn2(); +}; + +function fn3() { + console.log(this); //window +}; + +fn1(); +``` + + + +### 隐式绑定 + +什么是隐式绑定呢,如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上,看个例子: + +```javascript +function fn() { + console.log(this.name); +}; +let obj = { + name: '听风是风', + func: fn +}; +obj.func() //听风是风 +``` + +如果函数调用前存在多个对象,this指向距离调用自己最近的对象, 即使那个对象没有那个属性 + +```javascript +function fn() { + console.log(this.name); +}; +let obj = { + func: fn, +}; +let obj1 = { + name: '听风是风', + o: obj +}; +obj1.o.func() //undefined +``` + + + +### this显式绑定 + +显式绑定是指我们通过call、apply以及bind方法改变this的行为,相比隐式绑定,我们能清楚的感知 this 指向变化过程。来看个例子: + +```javascript +let obj1 = { + name: '听风是风' +}; +let obj2 = { + name: '时间跳跃' +}; +let obj3 = { + name: 'echo' +} +var name = '行星飞行'; + +function fn() { + console.log(this.name); +}; +fn(); //行星飞行 +fn.call(obj1); //听风是风 +fn.apply(obj2); //时间跳跃 +fn.bind(obj3)(); //echo +``` + +比如在上述代码中,我们分别通过call、apply、bind改变了函数fn的this指向。 + +在js中,当我们调用一个函数时,我们习惯称之为函数调用,函数处于一个被动的状态;而call与apply让函数从被动变主动,函数能主动选择自己的上下文,所以这种写法我们又称之为函数应用。 + +注意,如果在使用call之类的方法改变this指向时,指向参数提供的是null或者undefined,那么 this 将指向全局对象。 + +另外,在js API中部分方法也内置了显式绑定,以forEach为例: + +```javascript +let obj = { + name: '听风是风' +}; + +[1, 2, 3].forEach(function () { + console.log(this.name);//听风是风*3 +}, obj); +``` + + + +### call、apply与bind有什么区别? + +1.call、apply与bind都用于改变this绑定,但call、apply在改变this指向的同时还会执行函数,而bind在改变this后是返回一个全新的boundFcuntion绑定函数,这也是为什么上方例子中bind后还加了一对括号 ()的原因。 + +2.bind属于硬绑定,返回的 boundFunction 的 this 指向无法再次通过bind、apply或 call 修改;call与apply的绑定只适用当前调用,调用完就没了,下次要用还得再次绑。 + +3.call与apply功能完全相同,唯一不同的是call方法传递函数调用形参是以散列形式,而apply方法的形参是一个数组。在传参的情况下,call的性能要高于apply,因为apply在执行时还要多一步解析数组。 + +### new绑定 + +准确来说,js中的构造函数只是使用new 调用的普通函数,它并不是一个类,最终返回的对象也不是一个实例,只是为了便于理解习惯这么说罢了。 + +那么new一个函数究竟发生了什么呢,大致分为三步: + +1.以构造器的prototype属性为原型,创建新对象; + +2.将this(可以理解为上句创建的新对象)和调用参数传给构造器,执行; + +3.如果构造器没有手动返回对象,则返回第一步创建的对象 + +### this绑定优先级 + +this绑定优先级为: + +显式绑定 > 隐式绑定 > 默认绑定 + +new绑定 > 隐式绑定 > 默认绑定 + +为什么显式绑定不和new绑定比较呢?因为不存在这种绑定同时生效的情景,如果同时写这两种代码会直接抛错,所以大家只用记住上面的规律即可。 + +### 箭头函数的this + +ES6的箭头函数是另类的存在,为什么要单独说呢,这是因为箭头函数中的this不适用上面介绍的四种绑定规则。 + +准确来说,箭头函数中没有this,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this便指向谁。有点吃软饭的嫌疑,一点都不硬朗,我们来看个例子: + +```javascript +function fn() { + return () => { + console.log(this.name); + }; +} +let obj1 = { + name: '听风是风' +}; +let obj2 = { + name: '时间跳跃' +}; +let bar = fn.call(obj1); // fn this指向obj1 +bar.call(obj2); //听风是风 +``` + + +为啥我们第一次绑定this并返回箭头函数后,再次改变this指向没生效呢? + +前面说了,箭头函数的this取决于外层作用域的this,fn函数执行时this指向了obj1,所以箭头函数的this也指向obj1。除此之外,箭头函数this还有一个特性,那就是一旦箭头函数的this绑定成功,也无法被再次修改,有点硬绑定的意思。 + +当然,箭头函数的this也不是真的无法修改,我们知道箭头函数的this就像作用域继承一样从上层作用域找,因此我们可以修改外层函数this指向达到间接修改箭头函数this的目的。 -- Gitee From d756c8b2c4cd4cfc5b031fcabeb649e9fc621972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Sun, 6 Nov 2022 10:39:23 +0000 Subject: [PATCH 09/13] =?UTF-8?q?=E6=96=B0=E5=BB=BA=202022-11-03=20?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-11-03 \344\275\234\344\270\232/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/.keep" diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/.keep" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From aefd109b49b5dda32364423402e2e31862f346ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Sun, 6 Nov 2022 10:39:55 +0000 Subject: [PATCH 10/13] =?UTF-8?q?=E6=96=B0=E5=BB=BA=202022-11-03=20?= =?UTF-8?q?=E6=AD=A3=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2022-11-03 \346\255\243\345\210\231/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-03 \346\255\243\345\210\231/.keep" diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-03 \346\255\243\345\210\231/.keep" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-03 \346\255\243\345\210\231/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From e5cafebe8b3bd06ec4413e6061193f5352c2063c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Sun, 6 Nov 2022 11:58:03 +0000 Subject: [PATCH 11/13] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 何睿 <2476310189@qq.com> --- .../2022-11-03 \344\275\234\344\270\232.md" | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 "06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" new file mode 100644 index 0000000..6bf95a2 --- /dev/null +++ "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" @@ -0,0 +1,47 @@ +```javascript + // 1.邮政编码:由6个数字构成,第一位不可以是0 +// var a='065484' +// var b='164566' +// console.log(/[1-9]\d{5}/.text(a)); +// console.log(/[1-9]\d{5}/.text(b)); +// 2.手机号码:由13/15/17/18开头的11位数字 +// var e= '13345678978' +// console.log(/1[3578]\d{9}/.test(e)); + +// 3.QQ号:第一位不可以是0,位数在5-12位数字构成 +// var r='41564' +// console.log(/[1-9]\d{4,11}/.test(r)); + +// 4.检查是否是压缩文件:文件名由字母、数字、下划线构成,不可以以数字开头,后缀为.zip/rar/gz +// var y='dsfsd.zip' + +// console.log(/[a-zA-Z_]\w*\.(zip|rar|gz)/.test(y)); +// 5.密码:字母、数字、下划线构成,6-20位 +// var i='65465sdasd' +// console.log(/\w{6,20}/.test(i)); +// 6.用户名:字母、数字、下划线构成,6-16位,不能以数字开头 +// var ii='65465sdasdpo' +// console.log(/[^0-9]\w{5,15}/.test(ii)); +// 7.输入年龄:只能在18-40间 +// var p='8' +// console.log(/1[89]|[23]\d|40/.test(p)); +// 8.身份证号码:15或18位,如果是15位则全部为数字,如果为18位,前17位为数字,第18位为数字或字母x,字母不区分大小写 +// var m='65465465845788937o' +// console.log(/\d{15}|\d{17}(\d|x)/.test(m)); +// 9.中文名字:三个汉字、中间必须是小或晓 +// var l='小小小' +// console.log(/^[\u4e00-\u9fa5](小|哓)[\u4e00-\u9fa5]/.test(l)); +// 10.字符串去重 +// var str='456788' +// var reg = /(\w)\1*/g; +// console.log(str.replace(reg,'$1')); +// 11.字符串去全部空格 *let str = ' dsf sdfs fsdf 第三方 '* +// let str = ' dsf sdfs fsdf 第三方 ' +// var l=/\s*/g; +// console.log(str.replace(l,'')); +// 12.字符串去掉左右两边的空格*let str = ' dsf sdfs fsdf 第三方 '* +// let str = ' dsf sdfs fsdf 第三方 ' +// var l=/^\s*|\s*$/g; +// console.log(str.replace(l,'')); +``` + -- Gitee From a1431d005fa1177c8bf16d4b5d153f4eb764203d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Sun, 6 Nov 2022 12:06:59 +0000 Subject: [PATCH 12/13] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 何睿 <2476310189@qq.com> --- .../2022-11-03 \347\254\224\350\256\260.md" | 315 ++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100644 "06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-03 \346\255\243\345\210\231/2022-11-03 \347\254\224\350\256\260.md" diff --git "a/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-03 \346\255\243\345\210\231/2022-11-03 \347\254\224\350\256\260.md" "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-03 \346\255\243\345\210\231/2022-11-03 \347\254\224\350\256\260.md" new file mode 100644 index 0000000..3bd7a4f --- /dev/null +++ "b/06\344\275\225\347\235\277/\347\254\224\350\256\260/2022-11-03 \346\255\243\345\210\231/2022-11-03 \347\254\224\350\256\260.md" @@ -0,0 +1,315 @@ +# js正则 + +**js正则表达式的特殊字符** + + **js正则表达式字符 含意** + +  \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 + +  -或- + +  对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 + +  ^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" + +  $ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" + +  * 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa + +  + 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa + +  ? 匹配前面元字符0次或1次,/ba*/将匹配b,ba + +  (x) 匹配x保存x在名为$1...$9的变量中 + +  x|y 匹配x或y + +  {n} 精确匹配n次 + +  {n,} 匹配n次以上 + +  {n,m} 匹配n-m次 + +​ [xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) + +  [^xyz] 不匹配这个集合中的任何一个字符 + +  [\b] 匹配一个退格符 + +  \b 匹配一个单词的边界 + +  \B 匹配一个单词的非边界 + +  \cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M + +  \d 匹配一个字数字符,/\d/ = /[0-9]/ + +  \D 匹配一个非字数字符,/\D/ = /[^0-9]/ + +  \n 匹配一个换行符 + +  \r 匹配一个回车符 + +  \s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 + +  \S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ + +  \t 匹配一个制表符 + +  \v 匹配一个重直制表符 + +  \w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹 配"$5.98"中的5,等于[a-zA-Z0-9] + +  \W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。 + +  用re = new RegExp("pattern",["flags"]) 的方式比较好 + +  pattern : 正则表达式 + +  flags: g (全文查找出现的所有 pattern) + +  i (忽略大小写) + +  m (多行查找) + +##### vaScript动态正则表达式问题 + +  请问正则表达式可以动态生成吗? + +  例如JavaScript中: + +``` +  var str = "strTemp"; +``` + +  要生成: + +``` +  var re = /strTemp/; +``` + +  如果是字符连接: + +``` +  var re = "/" + str + "/"即可 +``` + +  正则表达式是一个描述字符模式的对象。 + +  JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. + +  在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp对象, + +  也可以用JavaScript 1.2中的新添加的一个特殊语法来创建RegExp对象.就像字符串直接量被定义为包含在引号内的字符一样, + +  正则表达式直接量也被定义为包含在一对斜杠(/)之间的字符.所以,JavaScript可能会包含如下的代码: + +``` +  var pattern = /s$/; +``` + +  这行代码创建一个新的RegExp对象,并将它赋给变量parttern.这个特殊的RegExp对象和所有以字母"s"结尾的字符串都匹配.用RegExp()也可以定义 + +  一个等价的正则表达式,代码如下: + +``` +  var pattern = new RegExp("s$"); +``` + +  无论是用正则表达式直接量还是用构造函数RegExp(),创建一个RegExp对象都是比较容易的.较为困难的任务是用正则表达式语法来描述字符的模式. + +正则表达式的模式规范是由一系列字符构成的.大多数字符(包括所有字母数字字符)描述的都是按照字面意思进行匹配的字符.这样说来,正则表达式/java/就和所有包含子串 "java" 的字符串相匹配.虽然正则表达式中的其它字符不是按照字面意思进行匹配的,但它们都具有特殊的意义.正则表达式 /s$/ 包含两个字符. 第一个特殊字符 "s" 是按照字面意思与自身相匹配.第二个字符 "$" 是一个特殊字符,它所匹配的是字符串的结尾.所以正则表达式 /s$/ 匹配的就是以字母 "s" 结尾的字符串. + +**1.直接量字符** + +  我们已经发现了,在正则表达式中所有的字母字符和数字都是按照字面意思与自身相匹配的.JavaScript的正则表达式还通过以反斜杠(\)开头的转义序列支持某些非字母字符.例如,序列 "\n" 在字符串中匹配的是一个直接量换行符.在正则表达式中,许多标点符号都有特殊的含义.下面是这些字符和它们的含义: + +  正则表达式的直接量字符 + +  字符 匹配 + +  字母数字字符 自身 + +  \ f 换页符 + +  \ n 换行符 + +  \ r 回车 + +  \ t 制表符 + +  \ v 垂直制表符 + +  \ / 一个 / 直接量 + +  \ \ 一个 \ 直接量 + +  \ . 一个 . 直接量 + +  \ * 一个 * 直接量 + +  \ + 一个 + 直接量 + +  \ ? 一个 ? 直接量 + +  \ | 一个 | 直接量 + +  \ ( 一个 ( 直接量 + +  \ ) 一个 ) 直接量 + +  \ [ 一个 [ 直接量 + +  \ ] 一个 ] 直接量 + +  \ { 一个 { 直接量 + +  \ } 一个 } 直接量 + +  \ XXX 由十进制数 XXX 指 定的ASCII码字符 + +  \ Xnn 由十六进制数 nn 指定的ASCII码字符 + +  \ cX 控制字符^X. 例如, \cI等价于 \t, \cJ等价于 \n + +  如果想在正则表达式中使用特殊的标点符号,必须在它们之前加上一个 "\" . + +**2.字符类** + +  将单独的直接符放进中括号内就可以组合成字符类.一个字符类和它所包含的任何一个字符都匹配,所以正则表达式 / [abc] / 和字母 "a" , "b" , "c" 中的任何一个都匹配.另外还可以定义否定字符类,这些类匹配的是除那些包含在中括号之内的字符外的所有字符.定义否定字符尖时,要将一个 ^ 符号作为从左中括号算起的第一个字符.正则表达式的集合是 / [a-zA-z0-9] / . + +  由于某些字符类非常常用,所以JavaScript的正则表达式语法包含一些特殊字符和转义序列来表示这些常用的类.例如, \s 匹配的是空格符,制表符和其它空白符, \s 匹配的则是空白符之外的任何字符. + +  正则表灰式的字符类 + +  字符 匹配 + +  [...] 位于括号之内的任意字符 + +  [^...] 不在括号之中的任意字符 + +  . 除了换行符之外的任意字符,等价于[^\n] + +  \w 任何单字字符, 等价于[a-zA-Z0-9] + +  \W 任何非单字字符,等价于[^a-zA-Z0-9] + +  \s 任何空白符,等价于[\ t \ n \ r \ f \ v] + +  \S 任何非空白符,等价于[^\ t \ n \ r \ f \ v] + +  \d 任何数字,等价于[0-9] + +  \D 除了数字之外的任何字符,等价于[^0-9] + +  [\b] 一个退格直接量(特例) + +**3.复制** + +  用以上的正则表式的语法,可以把两位数描述成 / \ d \ d /,把四位数描述成 / \d \ d \ d \ d /.但我们还没有一种方法可以用来描述具有任意多数位的数字或者是一个字符串.这个串由三个字符以及跟随在字母之后的一位数字构成.这些复杂的模式使用的正则表达式语法指定了该表达式中每个元素要重复出现的次数. + +  指定复制的字符总是出现在它们所作用的模式后面.由于某种复制类型相当常用.所以有一些特殊的字符专门用于表示它们.例如: +号匹配的就是复制前一模式一次或多次的模式.下面的表列出了复制语法.先看一个例子: + +  /\d{2, 4}/ //匹配2到4间的数字. + +  /\w{3} \d?/ //匹配三个单字字符和一个任意的数字. + +  /\s+java\s+/ //匹配字符串"java" ,并且该串前后可以有一个或多个空格. + +  /[^"] * / //匹配零个或多个非引号字符. + +  正则表达式的复制字符 + +  字符 含义 + +  {n, m} 匹配前一项至少n次,但是不能超过m次 + +  {n, } 匹配前一项n次,或者多次 + +  {n} 匹配前一项恰好n次 + +  ? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1} + +  + 匹配前一项1次或多次,等价于{1,} + +  * 匹配前一项0次或多次.等价于{0,} + +**4.选择,分组和引用** + +  正则表达式的语法还包括指定选择项,对子表达式分组和引用前一子表达式的特殊字符.字符| 用于分隔供选择的字符.例如: /ab|cd|ef/ 匹配的是字符串 "ab",或者是字符串 "cd",又或者 "ef". /\d{3}|[a-z]{4}/ 匹配的是要么是一个三位数,要么是四个小写字母.在正则表达式中括号具有几种作用.它的主要作用是把单独的项目分组成子表达式,以便可以像处理一个独立的单元那种用 *、+或? 来处理那些项目.例如: /java(script) ?/ 匹配的是字符串 "java",其后既可以有 "script",也可以没有. / + +  (ab|cd) + |ef) / 匹配的既可以是字符串 "ef",也可以是字符串"ab" 或者 "cd" 的一次或多次重复. + +  在正则表达式中,括号的第二个用途是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配的部分.例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + \ d+/.但是由于假定我们真正关心的是每个匹配尾部的数字,那么如果我们将模式的数字部分放在括号中 (/ [a-z] + (\d+)/) ,我们就可以从所检索到的任何匹配中抽取数字了,之后我们会对此进行解析的. + +  代括号的子表达式的另一个用途是,允许我们在同一正则表达式的后面引用前面的子表达式.这是通过在字符串 \ 后加一位或多位数字来实现的.数字指的是代括号的子表达式在正则表达式中的位置.例如: \1 引用的是第一个代括号的子表达式. \3 引用的是第三个代括号的子表达式.注意,由于子表达式可以嵌套在其它子表达式中, + +  所以它的位置是被计数的左括号的位置. + +  例如:在下面的正则表达式被指定为 \2: + +``` +  /([Jj]ava([Ss]cript)) \sis \s (fun\w*) / +``` + +  对正则表达式中前一子表达式的引用所指定的并不是那个子表达式的模式,而是与那个模式相匹配的文本.这样,引用就不只是帮助你输入正则表达式的重复部分的快 + +  捷方式了,它还实施了一条规约,那就是一个字符串各个分离的部分包含的是完全相同的字符.例如:下面的正则表达式匹配的就是位于单引号或双引号之内的所有字符.但是,它要求开始和结束的引号匹配(例如两个都是双引号或者都是单引号): + +``` +  /[' "] [^ ' "]*[' "]/ +``` + +  如果要求开始和结束的引号匹配,我们可以使用如下的引用: + +``` +  /( [' "] ) [^ ' "] * \1/ +``` + +  \1匹配的是第一个代括号的子表达式所匹配的模式.在这个例子中,它实施了一种规约,那就是开始的引号必须和结束的引号相匹配.注意,如果反斜杠后跟随的数字比代括号的子表达式数多,那么它就会被解析为一个十进制的转义序列,而不是一个引用.你可以坚持使用完整的三个字符来表示转义序列,这们就可以避免混淆了.例如, 使用 \044,而不是\44.下面是正则表达式的选择、分组和引用字符: + +  字符 含义 + +  | 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式 + +  (...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引 + +  用使用 + +  \n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数 + +**5.指定匹配的位置** + +  我们已经看到了,一个正则表达式中的许多元素才能够匹配字符串的一个字符.例如: \s 匹配的只是一个空白符.还有一些正则表达式的元素匹配的是字符之间宽度为0的空间,而不是实际的字符例如: \b 匹配的是一个词语的边界,也就是处于一个/w字字符和一个\w非字字符之间的边界.像\b 这样的字符并不指定任何一个匹配了的字符串中的字符,它们指定的是匹配所发生的合法位置.有时我们称这些元素为正则表达式的锚.因为它们将模式定位在检索字符串中的一个特定位置.最常用的锚元素是 ^, 它使模式依赖于字符串的开头,而锚元素$则使模式定位在字符串的末尾. + +  例如:要匹配词 "javascript" ,我们可以使用正则表达式 /^ javascript $/. 如果我们想检索 "java" 这个词自身 (不像在 "javascript" 中那样作为前缀),那么我们可以使用模式 /\s java \s /, 它要求在词语java之前和之后都有空格.但是这样作有两个问题.第一: 如果 "java" 出现在一个字符的开头或者是结尾.该模式就不会与之匹配,除非在开头和结尾处有一个空格. 第二: 当这个模式找到一个与之匹配的字符时,它返回的匹配的字符串前端和后端都有空格,这并不是我们想要的.因此,我们使用词语的边界 \b 来代替真正的空格符 \s 进行匹配. 结果表达式是 /\b java \b/. + +  下面是正则表达式的锚字符: + +  字符 含义 + +  ^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头 + +  $ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾 + +  \b 匹配的是一个词语的边界.简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符) + +  \B 匹配的是非词语的边界的字符 + +**6.属性** + +  有关正则表达式的语法还有最后一个元素,那就是正则表达式的属性,它说明的是高级模式匹配的规则.和其它正则表达式语法不同,属性是在 / 符号之外说明的.即它们不出现在两个斜杠之间,而是位于第二个斜杠之后.javascript 1.2支持两个属性.属性 i 说明模式匹配应该是大小写不敏感的.属性 g 说明模式匹配应该是全局的.也 + +  就是说,应该找出被检索的字符串中所有的匹配.这两种属性联合起来就可以执行一个全局的,大小写不敏感的匹配. + +  例如: 要执行一个大小不敏感的检索以找到词语 "java" (或者是 "java" 、"JAVA"等) 的第一个具体值,我们可以使用大小不敏感的正则表达式 /\b java\b/i .如果要在一个字符串中找到 "java" 所有的具体值,我们还可以添加属性 g, 即 /\b java \b/gi . + +  以下是正则表达式的属性: + +  字符 含义 + +  i 执行大小写不敏感的匹配 + +  g 执行一个全局的匹配,简而言之,就是找到所有的匹配,而不是在找到第一个之后就停止了 + +  除属性 g 和 i 之外,正则表达式就没有其它像属性一样的特性了.如果将构造函数 RegExp 的静态属性 multiline 设置为 true ,那么模式匹配将以多行的模式进行.在这种模式下,锚字符 ^ 和 $ 匹配的不只是检索字符串的开头和结尾,还匹配检索字符串内部的一行的开头和结尾. \ No newline at end of file -- Gitee From ae69ae495f6096bb074f636d763d91876922d992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E7=9D=BF?= <2476310189@qq.com> Date: Sun, 6 Nov 2022 13:20:22 +0000 Subject: [PATCH 13/13] =?UTF-8?q?update=2006=E4=BD=95=E7=9D=BF/=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A/2022-11-03=20=E4=BD=9C=E4=B8=9A/2022-11-03=20?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A.md.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 何睿 <2476310189@qq.com> --- .../2022-11-03 \344\275\234\344\270\232.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" index 6bf95a2..ec63dd1 100644 --- "a/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" +++ "b/06\344\275\225\347\235\277/\344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232/2022-11-03 \344\275\234\344\270\232.md" @@ -27,7 +27,7 @@ // console.log(/1[89]|[23]\d|40/.test(p)); // 8.身份证号码:15或18位,如果是15位则全部为数字,如果为18位,前17位为数字,第18位为数字或字母x,字母不区分大小写 // var m='65465465845788937o' -// console.log(/\d{15}|\d{17}(\d|x)/.test(m)); +// console.log(/^\d{15}$|^\d{17}(\d|x)$/.test(m)); // 9.中文名字:三个汉字、中间必须是小或晓 // var l='小小小' // console.log(/^[\u4e00-\u9fa5](小|哓)[\u4e00-\u9fa5]/.test(l)); -- Gitee