io操作
高性能服务器
如果大量的io操作 更适合node
计算操作不适合
线程池
cpu密集不适合 文件读写等
多线程会遇到锁的问题同时执行多个任务 切换时间片也会浪费时间
node不需要锁的问题
同步和异步(被调用者)
阻塞非阻塞(调用者)
聊天服务器 电子商务网站
node 直接调用gloabal上的属性
node 中gloable和this不相等
this是node运行文件时修改了this指向
var a=1
global.a 输出的结果是undefined
buffer 缓存区
process 进程
setTimeout
console.log
显示隐藏属性
connsole.dir(golbal,{showHidden:true})
process.stout.write('hello')
等价于console.log
console.time(‘start’)
console.timeEnd‘start’)
掐时间用的
console.assert()// 断言
process.cwd()// 查看当前路径
// 当前目录
process.chdir('4.node')
//改变当前路径
process.argv 参数
node 1.js haha haha haj
haha就是参数
node 1.js --port 3000 --color red
commander 把用户执行node时候传递的参数变成对象
process.argv.slice(2
)
放到数组里
slice 2 前两个不要
[--port,3000,--color,red]===>{port:3000,color:red}
let yargs = process.argv.slcie(2).reduce((prev,next,index,arr)=>{
if(next.includes('--')){
prev[next.slice(2)]===arr[index+1]
}
return prev
},{})
传递初始值{} 迭代器的第一个参数
env
set KEY = VALUE &&node 1.js
process.env.NODE_ENV
cross_env 解决linux export 和mac window的差异 设置环境变量
process.nextTick微任务
promise.resolve().then(()=>{
})
process.nextTick(()=>{
})
nextTick 比promsie先输出
不要写递归
很多时候我们希望调用完同步代码之后再执行某些事
class Eat(){
constructor(){
this.arr = []
process.nextTick(()=>{
// 同步执行后执行 拿到最终的输出
console.log(this.arr)
})
}
eat(type){
this.arr.push(type)
}
}
let e = new Eat()
e.eat('韩寒")
e.eat('火腿")
timeout setImmediate 这两个的执行顺序是不一定的
写setTimeout 0 其实是4ms
node准备执行的时候 可能是小于4ms
Promise.resolve().then(data=>{
console.log('promise1');
setTimeout(()=>{
console.log('ttimeout2')
},1000);
})
setTimeout(()=>{
console.log('timeout1')
Promise.resolve().then(data=>{
console.log('promise2')
})
},1000)
Promise.resolve().then(data=>{
console.log('promise1');
setTimeout(()=>{
console.log('ttimeout2')
},1000);
})
promise1>timout1>promise2>timeout2
promise1>timout1>timeout2>promise2
两种可能性
口诀:c
面试题:
fs.readFile('4.node/note.md',(err,data)=>{
setTimeout(()=>{
console.log('timeout2')
},0)
setImmediate(()=>{
console.log('setImmediate')
})
// 先走setImmediate( 后走timeout
poll轮训阶段等待到了时间再执行 走check 就是setImmediate
})