0%

  • __dirname: 总是返回被执行的 js 所在文件夹的绝对路径
  • __filename: 总是返回被执行的 js 的绝对路径
  • process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径
  • ./: 在 require() 中使用是跟 __dirname 的效果相同,不会因为启动脚本的目录不一样而改变,在其他情况下跟 process.cwd() 效果相同,是相对于启动脚本所在目录的路径。

PORT=4000 node index.js –设置环境

3DES加密,需要3个显式参数 –只要参数全部相同,3DES加密结果也是相同

  • 待加密数据 data
  • 加密密码 key
  • 偏移量 iv

看起来十分简单,但是3DES加密有其他很多种隐式参数:

  • mode: CryptoJS.mode.CBC
  • padding: CryptoJS.pad.Pkcs7

mode还有其他的类型,padding也是

阅读全文 »

阮一峰博客链接

一、为什么JavaScript是单线程?

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。
JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。
为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

二、见博客

同步异步关心的是消息通信机制

所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
例如:
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下”,然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

同步异步关心的是结果的返回方式

阅读全文 »

扩展运算符

扩展运算符就是... 不懂的情况下阅读难度笔记大,学会了以后非常好用
扩展运算符主要有两个作用

  1. 将一个数组转为用逗号分隔的参数序列
  2. 表示剩下的所有参数,并且合并成一个数组.

第一种情况主要是用来合并数组的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//ES5
[1, 2].concat(more)
// ES6
[1, 2, ...more]

var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];

// ES5的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]

// ES6的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
阅读全文 »

一共有4中情况:

  • 1.纯粹的函数调用
    属于全局性调用,因此this就代表全局对象Global。
1
2
3
4
5
6
var x = 1;
function test(){
  this.x = 0;
}
test();
alert(x); //0这里是调用了 test(),把 this.x 从1改成了0,所以这个时候的 this 指向的是全局变量
  • 2.作为对象方法的调用
    函数还可以作为某个对象的方法调用,这时this就指这个上级对象。

    阅读全文 »

简单说,中间件(middleware)就是处理HTTP请求的函数。 它最大的特点就是,一个中间件处理完,再传递给 下一个中间件。App实例在运行过程中,会调用一系列的中间件。
每个中间件可以从App实例,接收三个参数,依次为request对象(代表HTTP请求)、response对象(代表 HTTP回应),next回调函数(代表下一个中间件)。每个中间件都可以对HTTP请求(request对象)进行加工, 并且决定是否调用next方法,将request对象再传给下一个中间件。
一个不进行任何操作、只传递request对象的中间件,就是下面这样。

1
function uselessMiddleware(req, res, next) { 
  next();
}

上面代码的next就是下一个中间件。如果它带有参数,则代表抛出一个错误,参数为错误文本。

1
function uselessMiddleware(req, res, next) { 
  next('出错了!');
}

抛出错误以后,后面的中间件将不再执行,直到发现一个错误处理函数为止。

阅读全文 »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const getApplyQueue = (ownerId, channelId) => {
return new Promise((resolve, reject) => {
let sql = `select * from ApplyQueue where channelId="${channelId}" and ownerId="${ownerId}"order by time`;
db.query(sql, (err, userList) => {
if(userList.length == 0){
return resolve(`null`) // 这里如果不加 return 代码会向下执行
}
console.log(`userList is ${JSON.stringify(userList)}`)
getUserInfoByArray(userList).then((data) => {
resolve(data)
}).catch((err) => {
console.log(`err is ${err}`)
reject(err)
})
})
})
}
阅读全文 »

find:

数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。

1
2
[1, 4, -5, 10].find((n) => n < 0)
// -5

上面代码中,find方法的回调函数可以接受三个参数,依次为当前的值、当前的位置和原数组。

findIndexOf 返回是的 item 的 index, 其他都一样

阅读全文 »

闭包,简单来说就是可以读取其他函数内部变量的函数。只要满足这一点的函数,都可以叫闭包。

1
2
3
4
5
6
7
8
9
10
11
function example() {
var n = 1;
return fun(){
alert(n++)
};
}

var fun = example();
fun();
// 1 执行完后 n++,变量n任然存在于内存中 fun();// 2 fun = null;// n被回收

阅读全文 »