美文网首页
阮一峰JS教程读后感(八)标准库-Date、RegExp 、正则

阮一峰JS教程读后感(八)标准库-Date、RegExp 、正则

作者: 前端艾希 | 来源:发表于2019-06-27 18:03 被阅读0次

    一、Date对象

    1. 如果Date()接收了参数会返回什么值?

    即使带有参数,Date作为普通函数使用时,返回的还是当前时间。

    Date(2000, 1, 1)
    // "Thu Jun 27 2019 15:08:02 GMT+0800 (中国标准时间)"
    

    2. Date作为构造函数时的作用?

    如果不接收任何参数则返回当前时间,如果有参数则返回一个字符串代表参数对应的时间,另外,只要是能被Date.parse()方法解析的字符串,都可以当作参数。

    new Date('2013-2-15')
    new Date('2013/2/15')
    new Date('02/15/2013')
    new Date('2013-FEB-15')
    new Date('FEB, 15, 2013')
    new Date('FEB 15, 2013')
    new Date('February, 15, 2013')
    new Date('February 15, 2013')
    new Date('15 Feb 2013')
    new Date('15, February, 2013')
    // Fri Feb 15 2013 00:00:00 GMT+0800 (CST)
    

    3. Date.now()返回的时间戳和unix时间戳有什么区别?

    Date.now方法返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000。

    4. 如果想把当前时间转为时间戳怎么转?

    对date实例使用getTime和valueOf的效果是一致的。

    d = new Date()
    d.valueOf()
    d.getTime()
    // 1561620389122
    

    并且在预期为数值的场合,Date实例会自动调用该方法,所以可以用下面的方法计算时间的间隔。

    var start = new Date();
    // ...
    var end = new Date();
    var elapsed = end - start;
    

    二、RegExp 对象

    正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用来按照“给定模式”匹配文本。比如,正则表达式给出一个 Email 地址的模式,然后用它来确定一个字符串是否为 Email 地址。JavaScript 的正则表达式体系是参照 Perl 5 建立的

    1. 如何建立正则表达式

    新建正则表达式有两种方法。一种是使用字面量,以斜杠表示开始和结束。

    var regex = /xyz/;
    

    另一种是使用RegExp构造函数。

    var regex = new RegExp('xyz');
    

    因为直接通过字面量建立的正则表达式能够在脚本预编译阶段就建立正则表达式对象,而通过构造函数的方法必须在脚本执行到这里的时候才能建立正则表达式对象,所以前者的效率较高,并且比较直观,所以一般推荐使用前者。

    2. 如果正则表达式使用了g修饰符应该注意什么?

    带有g修饰符时,正则表达式内部会记住上一次的lastIndex属性,这时不应该更换所要匹配的字符串,否则会有一些难以察觉的错误。

    var r = /bb/g;
    r.test('bb') // true
    r.test('-bb-') // false
    

    正则实例对象的lastIndex属性不仅可读,还可写。设置了g修饰符的时候,只要手动设置了lastIndex的值,就会从指定位置开始匹配。

    3. 字符串的实例方法用到正则表达式的方法。

    字符串的实例方法之中,有4种与正则表达式有关。

    • String.prototype.match():返回一个数组,成员是所有匹配的子字符串。
    • String.prototype.search():按照给定的正则表达式进行搜索,返回一个整数,表示匹配开始的位置。
    • String.prototype.replace():按照给定的正则表达式进行替换,返回替换后的字符串。
    • String.prototype.split():按照给定规则进行字符串分割,返回一个数组,包含分割后的各个成员。

    三、正则表达式

    About

    本小节只是简要介绍正则表达式的匹配规则,具体细节请参考链接:https://wangdoc.com/javascript/stdlib/regexp.html

    1. 字面量字符和元字符

    大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b。如果在正则表达式之中,某个字符只表示它字面的含义(就像前面的a和b),那么它们就叫做“字面量字符”(literal characters)。

    除了字面量字符以外,还有一部分字符有特殊含义,不代表字面的意思。它们叫做“元字符”(metacharacters),主要有以下几个。

    (1)点字符 ' . ':

    点字符(.)匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。注意,对于码点大于0xFFFF字符,点字符不能正确匹配,会认为这是两个字符。

    (2)位置字符

    • ^ 表示字符串的开始位置
    • $ 表示字符串的结束位置

    (3)选择符' | '

    竖线符号(|)在正则表达式中表示“或关系”(OR),即cat|dog表示匹配cat或dog。

    2. 在正则表达式中使用转义字符时应该注意什么?

    通过字面量直接创建正则表达式转义字符为' \ '

    /1+1/.test('1+1')
    // false
    
    /1\+1/.test('1+1')
    // true
    

    而通过构造函数创建正则表达式时需要使用的转义字符为 ' \\ '

    (new RegExp('1\+1')).test('1+1')
    // false
    
    (new RegExp('1\\+1')).test('1+1')
    // true
    

    3. 字符类的含义?

    字符类(class)表示有一系列字符可供选择,只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内,比如[xyz] 表示x、y、z之中任选一个匹配。

    /[abc]/.test('hello world') // false
    /[abc]/.test('apple') // true
    

    但是有几个需要注意的使用点为:

    (1)脱字符(^)

    如果方括号内的第一个字符是[],则表示除了字符类之中的字符,其他字符都可以匹配。比如,[xyz]表示除了x、y、z之外都可以匹配。

    /[^abc]/.test('hello world') // true
    /[^abc]/.test('bbc') // false
    

    笔者认为这可以当做一个取反的功能。另外需要注意的是脱字符只有在字符类的第一个位置才有特殊含义,否则就是字面含义。

    (2)连字符(-)

    某些情况下,对于连续序列的字符,连字符(-)用来提供简写形式,表示字符的连续范围。比如,[abc]可以写成[a-c],[0123456789]可以写成[0-9],同理[A-Z]表示26个大写字母。

    /a-z/.test('b') // false
    /[a-z]/.test('b') // true
    

    连字符只有写在字符类中才有效。

    四、JSON对象

    JSON对象是 JavaScript 的原生对象,用来处理 JSON 格式数据。它有两个静态方法:JSON.stringify()和JSON.parse()。

    JSON.stringify('abc') // ""abc""
    JSON.stringify(1) // "1"
    JSON.stringify(false) // "false"
    JSON.stringify([]) // "[]"
    JSON.stringify({}) // "{}"
    
    JSON.stringify([1, "false", false])
    // '[1,"false",false]'
    
    JSON.stringify({ name: "张三" })
    // '{"name":"张三"}'
    

    注意,对于原始类型的字符串,转换结果会带双引号。

    JSON.stringify('foo') === "foo" // false
    JSON.stringify('foo') === "\"foo\"" // true
    

    1. 如果被转换的成员中有undefined,函数,或者XML对象,该如何处理?

    如果数组的成员是undefined、函数或 XML 对象,则这些值被转成null。并且也会忽略不可遍历的属性

    var arr = [undefined, function () {}];
    JSON.stringify(arr) // "[null,null]"
    

    相关文章

      网友评论

          本文标题:阮一峰JS教程读后感(八)标准库-Date、RegExp 、正则

          本文链接:https://www.haomeiwen.com/subject/wmfdcctx.html