JavaScript高级程序设计第5章(2)

位置方法:

indexOf() 从前往后 内部是使用全相等===的方法

lastIndexOf() 从后往前
都是接受两个参数,第一个是查找的项的值,第二个是从哪个开始

找到返回下标,找不到返回-1
比较简单,就不列举例子了。

某些迭代的方法,直接上例子:

var numbers = [1,2,3,4,5,4,3,2,1];

var ereryResult = numbers.every(function (item,index,array){
return item > 2;});
alert(false); //每一个都大于2,那么肯定是返回false了。注意every里面的函数参数必须三个,必须item,index,array

var someResult = numbers.some(function (item,index,array){
return item > 2)});
alert(true); //某一个大于2,确实是存在的,那么返回true。

var filterResult = numbers.filter(function (item,index,array){
return (item >2)});
alert(filterResult); //[3,4,5,4,3]

var mapResult = numbers.map(function (item,index,array){
return (item *2)});
alert(mapResult); //[2,4,6,8,10,8,6,4,2]

reduce()和reduceRight(),这两个方法都会迭代数组的所有项,然后构建一个最终返回的值

例子:
var values = [1,2,3,4,5];
var sumn = values.reduce(function(prev,cur,index,array){
return prev + cur;});
alert(sum); //15

Date类型
var now = new Date();

创建特定的日期
var someDate = new Date(Date.parse(“6/11/2020”);
或者
var someDate = new Date(Date.parse(“May 25,2020”);
或者
var allFives = new Date(2020,5,5,17,55,55);
2020年5月5号下午5点55分55秒

RegExp类型

var pattern1 = /at/g; //匹配字符串中所有"at"的实例,g表示全局模式

var pattern2 = /[bc]at/i //匹配第一个"bat"或"cat"的实例,i表示不区分大小写

var pattern3 = /.at/gi //匹配所有以"at"结尾的3个字符的组合,不区分大小写

var pattern2 = new RegExp("[bc]at","i); //跟第二个一样的意思

如果是使用构造函数的方法,原来的转义字符,要在它的前面多加一个

补:
1.
字面模式转为RegExp构造函数的时候,转义字符前面都需要加多一个
例如:

/[bc]at/ 等价于 “\[bc]at”
/.at/ 等价于 “\.at”
/name/age/ 等价于 “name\/age”
/\d.\d{1,2}/ 等价于 “\d.\d{1,2}”

^开始
$结束
*零次或多次
+一次或多次
?一次或者0次
{n}n次
{n,}至少n次
{n,m}至少n次,至多m次
. 匹配除了\n,\t之外任何单个字符
x|y 匹配x或者y
[abc] 匹配a或者b或者c
[^abc] 匹配除了a或者除了b或者除了c
[a-z] 匹配a到z
\b 匹配一个单词的边界 比如er\b 能匹配never中的er,但是不能匹配verb中的er
\B 匹配非边界的单词,比如er\B 能匹配verb中的er,但是不能匹配never中er
\d 匹配数字,与[0-9]一样
\D匹配非数字
在ECMAScript3中,正则表达式字面量始终会共享同一个RegExp实例,而使用构造函数创建的每个新的RegExp实例都是一个新的实例

例子:

var re = null;
for (var i = 0,i<10,i++){

re = /cat/g;
re.test("catsddsddfd");	

}

for (var i = 0,i<10,i++){

re = new RegExp("cat","g");
re.test("catsddsddfd");	

}
在第一个循环中,实际上只为/cat/创建一个RegExp实例,由于实例属性不会重置,第一次调用test,找到了cat字符串,返回true,第二次循环是从cat之后的s开始,即从索引3开始,找不到,到了尾部,那么第三次从尾部转移到头部重新检测

第二个循环使用RegExp构造函数,每次迭代都会创建一个新的实例,所以每次调用test函数都会返回true

但是到了ECMAScript5就明确规定了使用正则表达式字面量必须像直接调用RegExp构造函数一样,每次都会创建新的RegExp实例

举个例子详细说明RegExp实例的属性:

var pattern1 = /[bc]at/i;
alert(pattern1.global); //返回false,没有运用g标志
alert(pattern1.ignoreCase); //返回true,运用了i标志
alert(pattern1.mutiline); //返回false,没有运用m标志
alert*pattern1.source); //返回字面量形式的字符串形式:"[bc]at"

var pattern1 = new RegExp("\[bc\]at",“i”); //注意这里是两个\
alert(pattern1.global); //返回false,没有运用g标志
alert(pattern1.ignoreCase); //返回true,运用了i标志
alert(pattern1.mutiline); //返回false,没有运用m标志
alert*pattern1.source); //返回字面量形式的字符串形式:"[bc]at"

exec()函数如果没有查找到任何匹配,则返回null。

值得注意的是,每次执行exec()函数都只查找最多一个匹配并返回。

如果为正则表达式设置了全局标志(g),exec()函数仍然只返回最多一个匹配,不过我们再次调用该对象的exec()函数就可以查找并返回下一个匹配。

其原因是:如果regExpObject带有全局标志g,exec()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找。该属性值默认为0,所以第一次仍然是从字符串的开头查找。当找到一个匹配时,exec()函数会将regExpObject.lastIndex的值改为字符串中本次匹配内容的最后一个字符的下一个索引位置。当再次执行exec()函数时,将会从该索引位置处开始查找,从而找到下一个匹配。

因此,当我们使用exec()函数执行了一次匹配之后,如果想要重新使用exec()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为0。如果exec()函数再也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为 0。

光看定义还是不太行,举个例子:
var test =“mom and dad and baby”;
var pattern = /mom(and dad (and baby)?)?/gi;

var matches = pattern.exec(test);
alert(matches.index); //0
alert(matches.input); //mom and dad and baby
alert(matches[0]); //mom and dad and baby
alert(matches[1]); //and dad and baby
alert(matches[2]); //and baby

这个设置g的意义在于:每次调用exec()则都会在字符串中继续查找新匹配项

再例如:
var text = “cat,bat,sat,fat”;
var pattern1 = /.at/gi;
var matches = pattern1.exec(text);
alert(matches[0]);
var matches = pattern1.exec(text);
alert(matches[0]);
var matches = pattern1.exec(text);
alert(matches[0]);
var matches = pattern1.exec(text);
alert(matches[0]);
每次匹配完一个matches的lastIndex都会完后移动,如果你没设置g标志,那么每次匹配完都会从下标为0开始匹配

最后说一个实用的:
例如:
var model = “aa000-00-0000”
var pattern = /\d{3}-\d{2}-\d{4}/gi
if (pattern.exec(model)){

    alert("输入的形式正确!")
}else{

    alert("输入的形式不正确!")
}

结果是:输入的形式正确,拿来判断用户的输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值