JS常用点

来源:互联网 发布:config sae.php 编辑:程序博客网 时间:2024/06/14 04:23

以下的内容均是在学习名为“守候”的博主在sementfault分享的文章,过程中自己有些地方没有理解到的和开始不懂的和容易错误的地方,通过调试理解后,记录在这里。附上该文章地址是https://segmentfault.com/a/1190000010225928,里面有许多实用的方法。

一、不可避免地用到的正则表达式
1.关于$1…..9

看到$2的时候,惊觉自己看不懂。查找之后,对大家的描述始终不能理解,但是理解了之后,再回头去看大家的解释说得确实很对。就是这么纠结! 把看到的小程序小小地改动了一下(哈哈,换了一首自己比较喜欢的现代诗),              $ 1代表正则表达式匹配到的第一个子正则表达式;              $2代表正则表达式匹配到的第二个子正则表达式;              ...... 
  theObj.innerHTML=content.replace(Reg,"<span>$1</span>");//对匹配到的正则表达式,替换为第一个子表达式

效果如下图所示,要匹配的正则表达式为(你)(的),因此会首先找出所有的“你的”,再将“你的”替换为第一个正则表达式“你”,并设置字体颜色为红色。
这里写图片描述

这里写图片描述

接着将替换的内容换做$2:

theObj.innerHTML=content.replace(Reg,"<span>$2</span>");//对匹配到的正则表达式,替换为第一个子表达式

这里写图片描述

ok,验证结束!本例过程中,有对html标签进行过滤。原因是由于我们在选择到要选择的值时,为其增加了一个span标签,所以需要避免下一次操作时,上一轮的选择状态不会仍然存在。

//html标签的正则表达式,[^>]表示尖括号中间的内容/<\/?[^>]*>/            

这里写图片描述

二. 数组迭代方法
1.map( ) :对数组中每一项遍历,可指定运行的函数,返回每次函数调用的结果所组成的数组。

这里写图片描述

2.filter( ):同理也是遍历数组,可给每一项指定运行函数,每次返回值是返回拿到值为true的项,因此最终返回是一个由返回项值为true的数组成员所组成的新数组。

这里写图片描述

3.every和some
(1) every( ):同理,遍历数组,且对于指定的函数,只有当每一项执行函数的返回值为true,才返回true;
(2)some( ):同理,遍历数组,却对于指定函数,只要任一项执行该函数时返回值为true,则最终函数返回值为true;
eg:
这里写图片描述
4.forEach( )
对数组中的每一项运行给定函数,这个方法没有返回值 ;

5.reduce( ) !!!每次只能接受两个参数
作用效果和原理就是[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4),累加计算

6.finde( )和findeIndex( )
(1)find( ):返回符合条件(条件也是在函数中调用)的数组第一个元素;
(2)findIndex( ):返回符合条件(条件也是在函数中调用)的数组第一个元素的位置索引(从0开始);
三、实用小方法
1.字符串大小写切换(源码详见原博主文章,地址见本文开始)
在使用replace( )方法时,第二个参数为匿名函数,且有多个参数。

switch (type) {    case 1:        return str.replace(/^(\w)(\w+)/, function (v, v1, v2, v3, v4) {            console.log("v=",v);            console.log("v1=",v1);            console.log("v2=",v2);            return v1.toUpperCase() + v2.toLowerCase();        });    case 2:        return str.replace(/^(\w)(\w+)/, function (v, v1, v2, v3, v4) {            console.log("vv=",v);            console.log("v11=",v1);            console.log("v22=",v2);            console.log("v33=",v3);            console.log("v44=",v4);            return v1.toLowerCase() + v2.toUpperCase();        });    case 3:        return ToggleCase(str);    case 4:        return str.toUpperCase();    case 5:        return str.toLowerCase();    default:        return str;}       var str = "aA_SS_AD*dM";console.log(changeCase(str,1));console.log(changeCase(str,2));

打印结果:
这里写图片描述

分析后,发现,第二个参数为函数时,其实有三个参数是被确定的:
(1)参数1:匹配到的字符串;
(2)倒数第二个参数:匹配到的字符串中的第一个字符在原字符串中的索引位置;
(3)最后一个参数:原字符串;

而中间可以有多个参数,分别代表匹配到的字符串中,第一个子表达式的内容、第二个、第三个……上面的例子中,第一个子表达式,表示包括下划线的所有字母的字符。
故:调用函数的第一种处理时(首字母大写),明显可以看到v是匹配到的字符串,v1是匹配字符串中第一个字表达匹配到的字符a,v2是……第二个子表达式匹配到的字符b,v3匹配第一个字符在原字符中的位置索引(从0开始),v4则为原表达达式!
!!!值得注意的是:
(1)当字符串后部分存在不识别的字符时,正则匹配时自动忽略后面,例如上面打印输出的部分,v只截取了*之前的部分。
(2)只有通过正则表达式成功匹配时,才会执行后面的匿名函数,否则不会执行。验证如下:将字符串首字母改成*,因为匹配不成功,因此replace()方法返回值为原字符串本身。
这里写图片描述