计算机所有的内容最终都是使用二进制来表示的。而js可以直接处理其他非常直观的图片,比如字符串,但是图片这种,js一般只是告诉浏览器一个url,比如img的src。而浏览器就负责获取在这个图片,并且最终渲染出来。
前端一般可以依赖浏览器,但是对于服务器不同,我们用js,node开发服务器的时候,要处理的本地文件类型较多
我们可以将buffer看成是一个存储二进制的数组, 【八位二进制,【】,【】】
每一项可以保存8位2进制。
八个二进制作为一个单元就是1byte(1字节) = 8 bit
1kb = 1024btye
buffer相当于一个字节的数组,每一项对应一个字节,而字符串本质也是二进制,每个字符对应的是一个字节,我们也可以将字符串放入buffer去。
一个字符为一个字节,占一位,显示的是16进制
报警告了,过期了
使用Buffer.from代替new Buffer()
一个中文一般是三个字节。也可以采用不同的方式进行编码存储
使用uft16就一个中文对应两个字节
buffer.toString()可以解码//默认用utf-8
但是如果采用utf16le进行存储,解码的时候采用的是utf8所以会乱码。
解决办法:
buffer.toString(‘编码方式’)
其他创建方式
可以通过索引直接赋值,因为是展示16进制的,所以会默认转换位16进制的。
我们读取文件不指定是utf8转换时,直接读取Buffer。
读图片
有1w8k多个字节
直接读取然后写入到另一个文件去。
那我们要对图片做操作然后再写入,我们就得拿到Buffer数组,修改,然后将新的buffer数组写入即可。
使用第三方库sharp
npm install sharp
sharp可以对buffer数据做更多的处理
可以直接读文件,sharp会自动转为二进制
事实上我们创建buffer时,并不会频繁的向操作系统申请内存,它会默认申请一个8*1024个字节大小的内容,也就是8kb。
部分源码,创建了poolSize,然后创建createPool函数并执行
buffer.alloc
断言assertSize,判断是否为空,最后new一个FastBuffer,也就是创建新的内存,size是我们传入的大小
事件循环可以理解成是我们编写的js代码和浏览器(node)之间的一个桥梁。
浏览器的事件循环是一个我们编写的js代码和浏览器api如setTimeout,AJAX,监听事件的一个桥梁,他们之间通过回到函数沟通
node的事件循环是一个我们编写的js代码与系统调用与file network之间的一个桥梁,也是通过回调函数进行沟通。
比如浏览器就是多进程的,比如有渲染进程,Browser进程,GPU进程
而一个渲染进程,就有多个线程,比如js引擎线程,定时触发器线程,GUI渲染线程等等。
浏览器每个tag页就相当于一个进程。
一个浏览器20个进程。
js代码是在js引擎线程里面执行的,而js又是单线程的,这就说明只能在一个时间执行一个东西,一旦有东西耗时严重,后面就执行不了。所以有事件循环异步机制来解决这个问题。
js代码执行函数的时候,是会做一个入栈,栈的话是先进后出,像我们现在在node上运行一个js文件,其实是一个模块,也是一个函数,运行的时候,将整个文件压入栈,然后执行里面的代码,遇到执行函数的时候就继续压入栈,直到所以的代码执行完毕,整个文件才会出栈。
但如果有一个setTimeout的时候,setTimeout一入栈就会立马出栈,setTimeout会被执行,但是setTIMEOUT里面的函数不会被执行,setTimeout是异步的,而且不会阻塞后面的代码,为什么,因为浏览器有一个事件循环机制,setTimeout这些异步操作是会被放入事件队列里面去的
( 来自coderwhy老师的图)
事件队列的每个回调函数就是一个任务,而setTimeout,onclick, ajax这种就是宏任务,会放入宏任务队列(macrotask),但其实,像Promise.then(), queueMicrotask(自己定义的微任务)这种就是微任务,放入微任务队列(micortask)。
那他们的运行机制是如何,可以理解成函数调用栈同步的代码执行完毕后,开始执行微任务队列,当微任务队列执行完毕后,再执行宏任务队列,但是在执行完第一个宏任务后,还会继续查找微任务队列是否有新的任务,只有当微任务里面没有任务时,才能执行宏任务。 如果微任务中,又创建了微任务,那么还是会先执行微任务。
而async await可以看成
如
await aaa()
console.log(123213)
await后面的aaa就相当于new Promise(()=>{
aaa()这里面的代码
})
而后面的console要等到await执行完毕就相当于
new Promise((resolve)=>resolve()).then(
res=>{
console.log(123213)//在这里才能执行
}
)
就是另类的promise一样的。