JS学习快速笔记(五)

173 阅读3分钟

这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

标准对象

我们通常使用typeof获取对象的类型。

null的类型是objectArray的类型也是object,如果我们用typeof将无法区分出nullArray和通常意义上的object——{}

包装对象

在Java中我们知道有intInteger这样子的不同类型,以及两个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中numberbooleanstring都有包装对象。

他们的new方法会造成看上去一样,但是实际却返回false的状况

类型转换

Number()BooleanString()被当做普通函数,把任何类型的数据转换为numberbooleanstring类型

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,直到结束仍没有匹配到

因为是全局匹配所以不能使用^…$