这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
标准对象
我们通常使用typeof获取对象的类型。
null的类型是object,Array的类型也是object,如果我们用typeof将无法区分出null、Array和通常意义上的object——{}。
包装对象
在Java中我们知道有int和Integer这样子的不同类型,以及两个new String("123")的区别。
String a = new String("123");
String b = new String("123");
System.out.println(a == b);//false
System.out.println(a.equals(b));//true
那么我们就很容易理解,在JS中number、boolean和string都有包装对象。
他们的new方法会造成看上去一样,但是实际却返回false的状况
类型转换
Number()、Boolean和String()被当做普通函数,把任何类型的数据转换为number、boolean和string类型
var n = Number('123'); // 123,相当于parseInt()或parseFloat()
typeof n; // 'number'
var b = Boolean('true'); // true
var b2 = Boolean('false'); // true! 'false'字符串转换结果为true!因为它是非空字符串!
var b3 = Boolean(''); // false
Date
在JS中我们可以通过new Date()获取系统当前时间。
注意,当前时间是浏览器从本机操作系统获取的时间,所以不一定准确,因为用户可以把当前时间设定为任何值。
JavaScript的Date对象月份值从0开始,牢记0=1月,1=2月,2=3月,……,11=12月。
正则表达式
JS中有两种创建正则表达式的方式
- 直接通过反斜线包裹
/123_abc\d/ - 通过
new RegExp('ABC\-321\w')
注意:第二种写法,需要注意字符串的转义问题,字符串的两个
\实际上是一个``。
RegExp对象的test()方法用于测试给定的字符串是否符合条件。
var reg = /123_abc\d/;
reg.test("123_abc1"); // true
reg.test("123_abcd"); // false
使用正则切割字符串
'a b c'.split(' '); // ['a', 'b', '', '', 'c'] 无法识别多余空格
'a b c'.split(/\s+/); // ['a', 'b', 'c'] 可以识别任意个空格
'a,b, c d'.split(/[\s,]+/); // ['a', 'b', 'c', 'd'] 加上逗号
'a,b;; c d'.split(/[\s,;]+/); // ['a', 'b', 'c', 'd'] 加上分号
分组
在正则表达式中,我们可以通过()表示分组。举个例子:
var reg = /^(\d{2,3})-(\d{11})$/;
re.exec('86-12312341234'); //如果正则表达式中定义了组,就可以在RegExp对象上用exec()方法提取出子串来。
//返回 ['86-12312341234', '86', '12312341234', index: 0, input: '86-12312341234', groups: undefined]
re.exec('86-123123412345'); //exec()方法在匹配失败时返回null。
^表示从字符串开头开始匹配
$表示字符串末尾进行匹配
贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
var re = /^(\d+)(0*)$/;
re.exec('102300'); // ['102300', '102300', '']
//由于\d+采用贪婪匹配,直接把后面的0全部匹配了,最终的结果分组,就只有'102300'和''
我们在加个\d+后面加一个 ?就可以让\d+采用非贪婪匹配。
var re = /^(\d+?)(0*)$/;
re.exec('102300'); // ['102300', '1023', '00']
全局匹配
我们在正则中通过g标志,表示全局匹配。
全局匹配可以多次执行exec()方法来搜索一个匹配的字符串。
当我们指定g标志后,每次运行exec(),正则表达式本身会更新lastIndex属性,表示上次匹配到的最后索引。
var s = 'JavaScript, VBScript and JScript';
var re=/[a-zA-Z]+Script/g;
// 使用全局匹配:
re.exec(s); // ['JavaScript']
re.lastIndex; // 10
re.exec(s); // ['VBScript']
re.lastIndex; // 20
re.exec(s); // ['JScript']
re.lastIndex; // 29
re.exec(s); // null,直到结束仍没有匹配到
因为是全局匹配所以不能使用
^…$