笔记三:正则表达式、Node.js入门

355 阅读5分钟

一、考虑创建正则表达式的手段

1、使用字面量的方式:

const re = /1[1-8]\d+[a-z]/i(修饰符,如g);

使用方便、不用考虑二次转义,但子内容无法重复使用,正则过长导致可读性变差。

2、使用构造函数:

Const someRules = 字符串;

Const reg = new Regxp(字符串,i);

理解:正是因为字符串是可以用模板拼接的,这才让构造函数法具有了可复用性和可读性;但存在二次转义问题。

二、正则表达式的常用API、属性

1、re.test()

2、re.source

3、re.flags(返回模式g、i,es6支持,会默认按字母排序)

4、re.exec()(返回匹配信息数组)

5、Str.match()(在g修饰符下输出会发生变化,因此我们认为并不稳定)

6、re.lastIndex(正则表达式最后一次匹配成功的位置),它不会自己重置,所以连续使用的时候记得在每次匹配新的字符串前都要触发get重置。

7、str.replace()(这个也常用,带修饰符g后很好用)

三、思考以下正则


个人认为,复杂的正则表达式一定不能一股脑看,最好还是拿笔跟着画,一类字段一类字段拆开来进行阅读,真正实践的时候可以考虑把每个字段对应的正则式封装到一个map或者对象里,需要用到的时候再根据key提取出对应部分来进行字符串的拼接传入constructor。

四、新增的正则表示


五、数值的货币表示

正则写法:

let re1 = /(\d)(?=(\d{3})+(,|$))/g
        function formatCurrency1(str) {
            return str.replace(re1, "$1,");
        }

六、正则表达式处理颜色缩写

const letter = '[0-9a-z]';        
const hexRules= new RegExp
(`^#(?<r>${letter})\\k<r>(?<g>${letter})\\k<g>(?<b>${letter})\\k<b>(?<a>${letter}?)\\k<a>$`, 'i');
        //接口
        function shortenColor(str) {
            return str.replace(hexRules, '#$<r>$<g>$<b>$<a>');
        }

七、正则的验证

1、拆分清楚模块与意思。

2、大量数据进行测试(保证考虑的全面)。

八、node与JS的一些区别

1、提供了不少基于异步IO(读写文件)的接口。

2、语法类似,但主要遵守的规范可能不同(例如:CommonJS与ESM)。

3、能够与底层的系统进行交互。

九、补充CommonJS与ESM的一些区别

1、CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用;即ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块(例如模块A引入了模块B的值,其中在A中是可以直接通过引用改变B的非原始数据的)

2、CommonJS 模块是运行时才加载,ES6 模块是编译时就输出接口。

第二个差异是因为 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而ES6模块导出的不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。

十、Node.js的应用领域

1、服务端开发、爬虫。

2、编写命令行脚本。

3、客户端开发(electron)。

4、lot开发(物联网?)、图像处理算法…

个人认为计算密集型的任务能否胜任有待商榷。

十一、fs读写模块


这个模块请求也是基于上文提到的CommonJS规范(这里注意是存在一个异步操作,回调函数模式)。

十二、内置模块

个人的理解可以类比Python的内置包。

十三、补充CommonJS模块使用的方法

基本上就是通过module.exports = value或exports.xxx = value的格式对接口进行暴露;通过require(xxx)语法引入暴露的接口。require命令的基本功能是,读入并执行一个JavaScript文件,然后返回该模块的exports对象。如果没有发现指定模块,会报错。

CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。

十三、模块的类型

1、.js(常用)

2、.json(数据传输)

3、.node(c++编译成二进制文件)

4、.mjs(其实就是ESM规范的文件,最新支持)

十四、总结CommonJS的特点

1、所有代码都运行在模块的作用域,不会污染全局作用域。

2、模块可以进行多次加载而不耗费资源,它只会在第一次加载时运行一次,然后运行结果就会被缓存,以后再加载,就直接读取缓存结果。如果要想让模块再次运行,必须清除缓存。

3、模块加载的顺序依赖于其在代码中出现的顺序。

4、模块的加载机制是输入的是被输出的值的拷贝而非引用,也就是说它一旦输出一个值,模块内部的变化就不会影响到这个值。(例如说A引入了模块B,在A模块中是不能直接改变B模块的值的,因为此时A模块中来自B的数据已被缓存,除非在B中改写成一个函数,才能得到内部变动后的值)。

十五、package.json元数据



上述为Axios的package.json,其实属性名无非是一些简写的英文单词之间的组合,能看懂相关的英文名词读懂的难度就不大。

十六、看懂包依赖

1、“^”允许中版本、小版本更新。^1.1.2

2、“~”允许小版本更新。~1.1.2

3、“*”通配符。*1.1.2.

4、啥都不写,只接受:1.1.2.

5、X写法联想一下Vue的文档

十七、NPM的缺陷

其实本质就是社区的信赖问题。

十八、需要通过实践了解的Node框架

think.js、Koa、express