玩转javascript异步编程
转载链接:https://mp.weixin.qq.com/s?__biz=MzI1ODI5NjE1NQ==&mid=2247485489&idx=1&sn=06878d23c05a1042ba51590414ae12ff&chksm=ea0b1805dd7c911327f08f659c87b23d02600d55a686b22e69c27afe8d42ca506786e7abcac0&scene=0&xtrack=1#rd
- 异步的几种常用方法
- 回调函数
- 订阅和发布模式
- Promise
- generator
- async/await
逻辑计算
-
运算
&&
|| -
位运算
&
|
被忽视的某些函数:
变量在字符串中的引用
① ` ${ para } ` 注意!! 是要 `` 而不是单引号
var a = 1;
console.log(`a的值是:${a}`); //a的值是:1
② " + para + "
const person = {
fname: "san",
lname: "zhang",
age: 99
};
let info;
for(info in person) {
console.log("person[" + info + "] = " + person[info]);
}
// 结果 //
person[fname] = san
person[lname] = zhang
person[age] = 99
常用数组函数
- filter 过滤掉全部
- forEach 遍历每一个,不能停
- some 可以通过return停
- some函数、fineIndex函数,索引直到return 可以通过return停
【splice 删除】
上面的函数等于下面的作用
字符串函数
-
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
-
charAt() 方法:判断哪个字符在哪个位置
- var str=“Hello world!”
document.write(str.charAt(1))
- var str=“Hello world!”
-
indexOf 搜寻是否包含某一字符串
- arr.includes(smallarr) 有则返回true
能够返回所有如何条件的item 到newList中
JSON 与 JSON字符串
-
在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:
JSON字符串:
var str1 = ‘{ “name”: “cxh”, “sex”: “man” }’;
JSON对象:
var str2 = { “name”: “cxh”, “sex”: “man” }; -
//由JSON字符串转换为JSON对象
var obj = eval(’(’ + str1 + ‘)’);
或者
var obj = str1.parseJSON();
或者
var obj = JSON.parse(str1); -
//将JSON对象转化为JSON字符串。
例如:
var last=obj.toJSONString();
或者
var last=JSON.stringify(obj);
module.exports
参考:https://www.cnblogs.com/fayin/p/6831071.html
CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的module.exports属性。
for-in、for-of、 forEach
- for-in
[for…in 作用在数组上【不推荐】]
- for…of
语句创建一个循环来迭代可迭代的对象。在 ES6 中引入的 for…of 循环,以替代 for…in 和 forEach() ,并支持新的迭代协议。for…of 允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构等。
举例参考:https://www.cnblogs.com/m2maomao/p/7743143.html
- forEach:
在 for 循环中可以使用 continue,break 来控制循环和跳出循环,这个是 forEach 所不具备的。forEach 只支持 IE9 及以上
正则表达式
学习网站:http://www.runoob.com/regexp/regexp-syntax.html
https://www.cnblogs.com/chenmeng0818/p/6370819.html
括号参考:https://www.jb51.net/article/52594.html
*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
由于邮箱的基本格式为“名称@域名”,需要使用“^”匹配邮箱的开始部分,用“KaTeX parse error: Can't use function '\.' in math mode at position 75: …[a-zA-Z0-9_-]+(\̲.̲[a-zA-Z0-9_-]+)…/
setTimeout延时0毫秒的作用
JavaScript 是单线程执行的,也就是无法同时执行多段代码,当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中取出下一个任务。这也常被称为 “阻塞式执行”。所以一次鼠标点击,或是计时器到达时间点,或是 Ajax 请求完成触发了回调函数,这些事件处理程序或回调函数都不会立即运行,而是立即排队,一旦线程有空闲就执行。
参考:https://blog.csdn.net/evkj2013/article/details/81137003
https://www.cnblogs.com/gaojian0927/p/9722847.html
1、实现javascript的异步;
正常情况下javascript都是按照顺序执行的。但是我们可能让该语句后面的语句执行完再执行本身,这时就可以用到setTimeout延时0ms来实现了。
如:
alert(1);
setTimeout(“alert(2)”, 0);
alert(3);
虽然延时了0ms,但是执行顺序为:1,3,2
这样就保证setTimeout里面的语句在某一代码段中最后执行。
2.立即插队
假如当前 JavaScript 进程正在执行一段很耗时的代码,此时发生了一次鼠标点击,那么事件处理程序就被阻塞,用户也无法立即看到反馈,事件处理程序会被放入任务队列,直到前面的代码结束以后才会开始执行。如果代码中设定了一个 setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但不是立即执行,仍然要等待前面代码执行完毕。所以setTimeout 并不能保证执行的时间,是否及时执行取决于 JavaScript 线程是拥挤还是空闲。