- 01.+0.2!=0.3 二进制浮点数转十进制 实际=0.3000 000 000 0004
- 解决办法:parseFloat((0.1+0.2).toFixed(10));
- 10个AJAX同时给hi发送请求至多允许三次失败:
- Promise.all(),但是失败一次就返回了,不行。
- Ajax(url,(res)=>{if(success){successIndex++}else{errprCount++;if(errorCount>3{}}});
- Let p =new Promise((resolve,reject)=>{if(success){resolve(res.data)}else{errorCount++;if(errorCount>3{})}});
- localstorge设计一个1M的缓存系统,需要实现缓存淘汰机制:
- 每个存储对象添加1个属性:存储时间;
- 判断所有存储属性大小>1M按照时间排序,删除多余的老的时间存储对象;
- 详细说明 Event loop事件循环
js是门非阻塞单线程语言;如果是多线程处理DOM就会发生冲突;
- JS在执行的而过程中会产生执行环境,这些执行环境会被顺序的加入到执行栈中。如果遇到异步的代码,会被挂起并加入到task队列(多种task)中。一旦执行栈为空,Even loop会在task队列中拿出需要执行的代码并放入执行栈中执行,所以本质上来说js中的异步还是同步行为。
- Console.log('start');
settimeout(function(){console.log('settimeout')},0);
console.log('end');
//start end settimeout
settimeout函数虽然为0,但是h5规定第二个参数不得小于4毫秒,不足会自动增加;所以.
- 不同的任务源会被分配到不同的Task队列中,任务远可以分为:微任务microtask=jobs,宏任务macrotask;
Console.log('start');
settimeout(function(){console.log('settimeout')},0);
new promise((resolve)=>{console.log('promise1') resolve()})
.then(function(){console.log('promise2')})
.then(function(){console.log('promise3')})
console.log('end');
//start promise1 end promise2 promise3 settimeout因为promise属于微任务,settimeout属于宏任务;
- 微任务:promise process.nextTick object.observe
- 宏任务:settomeout setinterval script I/o
- 微任务一定快于宏任务?错!
因为宏任务中包含 script浏览器会先执行一个宏任务,接下来有异步代码的话就先执行微任务:
- 执行同步代码,属于宏任务;
- 执行栈为空,查询是否有微任务需要执行
- 执行所有微任务;
- 必要的渲染UI;
- 开始新一轮 Event loop;
如果宏任务中异步代码有大量的计算并且需要操作DOM,可以把操作DOM放入微任务中。
- js原始数据类型:
- 原始(基本)类型:Number null boolean undefined string +symbol(es6) +BigInt(es10);
- 复杂数据类型:object
- null是对象码?不是,虽然typeof null=='object’,但是不是对象,历史遗留问题:
最初版本使用的是32系统,为了性能考虑地低位存储变量的类型信息,000开头表示对象,null表示全为0,所以将他错误的判断为对像。
- 基本与复杂区别:
- 内存分配不同;
- 基本:栈
- 复杂:堆,栈存储的是其 引用地址;
- 访问机制不同;
- 基本:安值访问;
- 复杂:引用访问;
- 复制变量不同;
- 基本:a=b完全独立,互不影响;
- 复杂:a=b;a.age=20;b.age//20;一个值改变,另一个也会改变;
- 函数参数传递不同
- 基本:拷贝栈中的值,修改互不影响;
- 复杂:拷贝是引用地址,修改互相影响
- HTML5语义化理解:
- 简单 清晰 易读,便于维护;
- 方便设备解析;
- 利于搜索引擎优化;