数据类型检测
1.typeof
1.返回字符串,字符串包含了对应数据类型
2.不能检测null
3.不能检测对象数据类型
2.instanceof 检测实例是否属于某个类的方法
1.只要当前类的原型在当前实例的原型上,都是true
2.只有改变了当前实例的原型链,检测结果就不再准确
3.不能检测字面量方式创建的基本数据类型值
var ary = [];
console.log(ary instanceof Array);
var obj = {};
console.log(obj instanceof Array);
console.log(ary instanceof Object);
function fn(){
}
console.log(fn instanceof Object);
function fn(){
arguments.__proto__ = Array.prototype
console.log(arguments instanceof Array);
}
fn(1,2,3,4)
var num = 1;
console.log(num instanceof Number);
var nom = new Number(1)
console.log(nom instanceof Number);
3.constructor 原型中天生自带的属性名
1.不能检测基本数据类型值得null.或undefined
2.如果原型扩展以及继承都有可能导致原型指向发生改变,结果不准确
var ary = [];
console.log(ary.constructor === Array);
console.log(ary.constructor === Object);
var obj = {};
console.log(obj.constructor === Array);
var num = 1;
console.log(num.constructor === Number);
4.Object.prototype.toString.call()
Object原型上的toString方法执行,会默认返回当前方法中this对应的结果
toString 转字符串
var num = 1;
var arr = [1,2,3]
var obj = {};
console.log(obj.toString());
console.log(num.toString());
console.log( Object.prototype.toString.call(arr));
console.log( Object.prototype.toString.call(null))
console.log( Object.prototype.toString.call(undefined))
num.toString === obj.toString
console.dir(toString.call(window))
正则
正则 引用数据类型
正则是js的内置类 RegExp
正则就是处理字符串的,他是跟字符串相互配合使用
字符串方法: charAt substr substring slice replace split indexOf lastIndexOf toUpperCase toLowerCase trim trimLeft() trimRight()
1.字面量创建
var reg = /\d+/;
2.实例创建 RegExp
可以引入变量
如果出现转义字符 转义前面再加一个\
正则:正则由两部分组成:元字符和修饰符
元字符 :在正则中有特殊含义的一些字符
修饰符:就是把正则额外的修饰一下
i: 不区分大小写
m:多行匹配
g:全局匹配
元字符:量词元字符、普通元字符、特殊元字符
量词元字符:代表出现的次数
*:代表0到多次
+:出现一到多次
?:出现0到1次
{n}:出现n次
{n,}:至少出现n次
{n,m}出现n到m次
特殊元字符:单个或者多字符组合在一起具有特殊意义
\:转义字符:可以把普通元字符字符转换为特殊的元字符,也可以把特殊元字符转换为普通元字符
.:除了换行符以外的任意字符
^:以什么什么开头
$:以什么什么结尾
\n:换行符
\d:0-9之间的数字
\D:非0-9之间的数字
\w:数字、字母、下划线
\s:空白字符
\t:制表符
\b:单词边界
x|y:取x或y的任意一个
[xyz]:取x、y、z中的任意一个
[a-z]:在a到z单位内取一个
[^a-z]:取反
():分组
(?:):只匹配不捕获
(?=):正向预查
(?!):负向预查
普通元字符:
let reg = /name/
正则捕获不到位null
匹配不到位false
test:检测,匹配,如果检测成功,返回true,没有成功返回false
exec 捕获 返回一个数组 第一项就是捕获到的内容 第二项捕获内容开始的索引 第三项检测的整个字符串的整体
1.返回一个数组 数组第一项是字符串中满足大正则中的内容
2.如果捕获不到 返回null
var reg = /\d+/
console.log(reg.exec('zhufeng2000peixun2019'));
1.正则的懒惰性 :正则找到符合正则的值以后,就不再向后捕获 reg:lastIndex 不加g每次默认从索引0开始捕获
g:原理 :没捕获一次,当前正则的lastIndex就会修改成下一轮开始捕获的索引位置
取消正则的懒惰性,用正则的修饰符g
var reg = /\d+/g
console.log(reg.lastIndex);
console.log(reg.exec('zhufeng2000peixun2019'));
console.log(reg.lastIndex);
console.log(reg.exec('zhufeng2000peixun2019'));
console.log(reg.lastIndex);
2.正则的贪婪性
?:放在量词的后面,是取消捕获的贪婪性
一个一个字符进行捕获
小括号
小括号 也要进行一次捕获,从左往右依次进行捕获
(?:) 取消捕获
正则简单案例
手机号
let reg = /^1\d{10}$/
console.log(reg.test('12345678911'));
有效数字
let reg = /^-?(\d|[1-9]\d+)(\.\d+)?$/
console.log(reg.test('a8864.aad'));
身份证号
let reg = /^(\d{6})([12]\d{3})(0[1-9]|1[0-2])(0[1-9]|12\d|3[0-1])(\d{3})(\d|x)/
console.log(reg.exec('1406021996120375151203'));
18-65
let reg = /^(1[89]{1}|[2-5]\d{1}|6[0-5]{1})$/
console.log(reg.test('66'));
汉字 unicode [\u4E00-\u9FA5] 所有汉字编码范围
let reg = /[\u4E00-\u9FA5]+/
console.log(reg.test('的撒大苏打啊大苏打'));
邮箱
let reg = /^[0-9a-zA-Z_\u4E00-\u9FA5]+@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+$ /
正则的括号
[] 中括号中,不识别多位数
var reg = /[abc]/
console.log(reg.test('abc'));
var reg1 = /^[1-9_]$/
console.log(reg1.test('9'));
var reg2 = /[18-65]/
()正则的小括号
1.改变正则的优先级
var reg = /^a|food$/;
console.log(reg.test('a'));
console.log(reg.test('aood'));
console.log(reg.test('aoog'));
console.log(reg.test('erfood'));
2.分组引用
var reg = /^(zhufeng)(peixun)\1\2$/
console.log(reg.test('zhufeng'));
console.log(reg.test('zhufengpeixunzhufeng'));
console.log(reg.test('zhufengpeixunzhufengpeixun'));
3.用于小正则捕获
小括号要进行捕获,从左往右依次进行
var reg = /^-?(\d|[1-9]\d+)(\.(\d+))?$/
console.log(reg.exec('35.6789'));
正则的match
var str = 'zhufeng123peixun456';
var arr = str.match(/\d+/g)
console.log(arr);
var reg = /A/i;
console.log(reg.test('abc'));
正则的replace
replace : 字符串替换 原字符串不发生改变 会得到替换之后的返回值
每次只能替换一个
var str = 'trueortrue'
var newStr = str.replace('true','false').replace('true','false')
console.log(newStr);//falseorfalse
结合正则
(1)replacee(reg,str);用该正则对字符串形成捕获,把捕获到内容替换成后面的字符串
var str = 'trueortrue'
var newStr = str.replace(/true/g,false)
console.log(newStr);
正则和回调函数
1.正则对字符串进行捕获,并且将回调函数的返回值覆盖捕获到的内容
2.正则捕获几次,回调函数执行几次
3.形参分别代表不同的值
var str = 'trueortrue'
var newStr = str.replace(/true/g,function(a,b,c){
console.log(a);
console.log(b);
console.log(c);
return false
})
console.log(newStr);
replace案例
var str = 'my name is niu,i am 28 years old';
var ary = str.replace(/\b[a-z]/g,function(a,b){
a = a.toUpperCase()
console.log(a,b)
return a
})
console.log(ary);
var str = '20191224'
var ary = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖","万","仟"];
var aoe = str.replace(/\d/g,function(a,b){
for(var i = 0;i<ary.length;i++){
console.log(a);
if(i = a ){
return ary[i]
}
}
return a
})
console.log(aoe);
var str = "2019-12-24 16:02:30";
var ary = ["年","月","日","时","分","秒"];
var i = 0
var aoe = '';
var one = str.replace(/\d+/g,function(a,b){
aoe += a + ary[i++]
console.log(aoe);
return aoe
})
console.log(aoe);
var str = "13234567753224";
var newStr = str.replace(/^(\d{1,3})((\d{3})+)$/,function(a,b,c){
var part2 = c.replace(/\d{3}/g,function (d,e) {
console.log(d);
return ','+d
})
return b +part2
})
console.log(newStr);
var str = "13234567753224";
var newStr = str.replace(/\d/g,function(a,b){
console.log(str.length);
if((str.length-b-1)%3 === 0 && str.length-1 !== b){
return a + ','
}else{
return a
}
})
console.log(newStr);
```