做题目遇到这个问题,对于其中正则实现的方法,对于疑惑点进行了注释,共三点。
1.为什么使用toString
2. strObj.indexOf()=-1代表什么
3.stringObj.replace(regExp,function($0,$1))的$0$1是什么?
4.return num&&()是什么?
5.正则表达式中的?=
一个源码:js正则式实现千位分隔符
function ce(num) {
return num &&
(num .toString().indexOf('.') != -1
?
num.toString().replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {return $1 + ",";})
:
num.toString().replace(/(\d)(?=(\d{3}))/g, function($0, $1) {return $1 + ",";}));
}
console.log(ce(1353400.23));
1.为什么使用toString
replace() index()方法是对字符串对象进行操作
2. strObj.indexOf()=-1
代表strObj找不到str
3.stringObj.replace(regExp,function($0,$1))的$0$1是什么?
①stringObj.replace(regExp,function($0,$1))此处的$0 $1与strObj.replace(regExp,$0,$1)不同.
②strObj.replace(regExp,$1)直接以字符串代替符合regExp的字符串,$1-$99 代表符合第n个子表达式的字符串,以左括号作为区分,第一个左括号以内的为$1。
③stringObj.replace(regExp,function()) function中含四个参数,可以写作任意的符号,此时$0 $1只表示参数的位置,具体用法为:(参考链接:replace(regExp,function)用法/示例 replace(regExp,function)用法/示例)
function(A,B,C,D)A 匹配完整模式的字符串 B 从完整模式的字符串中匹配子模式的字符串 C 完整模式时的字符位置,从零开始 D 被搜索的字符串本身
例子:
name = 'aaa bbb ccc abc';
uw=name.replace(/\b\w+\b( ab)/g, function($0,$1,$2,$3){
console.log('|'+$0+'|'+$1+'|'+$2+','+$3);
}
);
将会显示下面的结果
|ccc ab| ab|8,aaa bbb ccc abc
4.return num&&()是什么?
参考链接:逻辑与逻辑或的短路原理
逻辑或短路原理
(1) 只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。
(2) 只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值。
逻辑与短路原理
(1) 只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;
(2) 只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;
示例一:这里顺便提下:经常有人问我,看到很多代码if(!!attr),为什么不直接写if(attr);其实这是一种更严谨的写法:
请测试 typeof 5和typeof !!5的区别。
!!的作用是把一个其他类型的变量转成的bool类型。
示例二: callback&&callback()
在回调中,经常这么写,更严谨,先判断 callback 是不是存在,如果存在就执行,这样写的目的是为了防止报错。
如果直接写 callback(); 当callback不存在时代码就会报错。
5.正则表达式中的?=
此代码中,含义为可以匹配?=之后的模式但只返回?=之前的内容。
是断言的一种,具体的断言参考链接:正则表达式分组、断言详解