Node.js学习笔记-02

三、node的异步I/O

四、异步编程

1、函数式编程

高阶函数

函数可以作为参数或者返回值。

偏函数用法

偏函数用法是指创建一个调用另外一个部分------参数或变量已经预置的函数------的函数的用法。

举个例子:在JavaScrip中进行类型判断时,我们通常会进行类似上述代码的方法定义。如下代码存在的问题是需要重复去定义一些相似的函数,如果有 更多的isXXX(),就会出现更多的冗余代码。

js 复制代码
var toString = Object.prototype.toString;
var isString = function (obj){
	return toString.call(obj) =='[object String]';
}
var isFunction = function (obj){
	return toString.call(obj) == '[object Function]';
}

改造以后

js 复制代码
var isType = function (type) {
    return function (obj) {
        return toString.call(obj) == '[object ' + type + ']';
    }
}
var isString = isType('String')
var isFunction = isType('Function')
console.log(isString)
console.log(isFunction)

2、异步编程的优势与难点

Node利用JavaScript及其内部异步库,将异步直接提升到业务层面,这是一种创新。

优势

Node带来的最大特性莫过于基于事件驱动的非阻塞I/O模型,这是它的灵魂所在。非阻塞I/0可以使CPU与I/O并不相互依赖等待,让资源得到更好的利用。对于网络应用而言,并行带来的想象空间更大,延展而开的是分布式和云。并行使得各个单点之间能够更有效地组织起来,这也是Node在云计算厂商中广受青睐的原因,图4-1为异步IO调用的示意图。

难点

  1. 异常处理
  2. 函数嵌套过深
  3. 阻塞代码
  4. 多线程编程
  5. 异步转同步

3、异步编程的解决方案

1. 事件发布/订阅模式

2.Promise / Deferred

3.流程控制库

4、异步并发控制

五、内存控制

V8的内存限制:

在一般的 后端开发语言中,在基本的内存使用上没有什么限制。然而在Node中通过JS使用内存时就会发现只能使用部分内存(64位系统下约为1.4GB,32位系统下 约为0.7GB)。在这样的限制下,将会导致Node无法直接操作大内存 对象。

高效使用内存

这一节中定义的闭包概念是:
实现外部作用域访问内部作用域中变量的方法叫做闭包(closure)。

小结:

在正常的JavaScript执行中,无法立即回收的内存有闭包和全局变量引用这两种情况。由于V8的内存限制,要十分小心此类变量是否无限制地增加,因为它会导致老生代中的对象增多。

六、理解 Buffer

Buffer是一个像Array的对象,但它主要用于操作字节。下面我们从模块结构和对象结构的层面上来认识它。

1、Buffer结构

模块结构:

Buffer 是一个典型的JavaScript与C++结合的模块,它将性能相关部分用C++实现,将非性能相关的部分用JavaScript实现。

Buffer所占用的内存不是通过V8分配的,属于堆外内存。由于V8垃圾回收性能的影响,将常用的操作对象用更高效和专有的内存分配回收策略来管理是个不错的思路。

由于 Buffer 太过常见,Node 在进程启动时就已经加载了它,并将其放在全局对象(global)上。所以在使用Buffer时,无需通过 require() 即可直接使用。

2、Buffer的转换

3、Buffer的拼接

4、Buffer与性能

相关推荐
子非鱼942723 分钟前
10-Flutter调用鸿蒙原生能力前置课:MethodChannel和PlatformView准备
学习·flutter·华为·harmonyos
小L~~~26 分钟前
MLIR学习笔记
笔记·学习·mlir
Asize40 分钟前
Node path 与 fs 模块:从回调地狱到 async await 的异步进化
javascript·node.js
从零开始的代码生活_42 分钟前
C++ string 详解:常用接口、字符串算法与深拷贝实现
开发语言·c++·后端·学习·算法
阿哟阿哟2 小时前
Ansys Electronics Desktop(hfss)仿真PCB(AD)
笔记
~kiss~2 小时前
LLM 的 层归一化(稳定训练) - Layer Normalization & RMSNorm
学习
MartinYeung53 小时前
[论文学习]LLM-based AI Agent 安全威胁与防御系统性综述
人工智能·学习·安全
大家的林语冰3 小时前
😭 Electron 麻了,Deno 直接支持二进制应用,无需第三方桌面应用框架!
前端·javascript·node.js
阿米亚波3 小时前
【C++ STL】std::deque
数据结构·c++·笔记·算法·stl
再玩一会儿看代码3 小时前
JUnit 测试框架详解:从实际开发、业务测试到 Java 面试高频问题
java·经验分享·笔记·junit·面试