1. 简述async和await的原理和流程
async的原理是Generator的语法糖,内置执行器,后面跟一个函数,表示内部有异步方法执行。
await的原理:async函数内遇到await就会立即执行await后的异步操作,执行完毕返回结果后执行后面的代码。
async和await的流程是将内部的异步代码进行同步执行,执行完毕后返回一个promise对象
2. 简述事件委托的原理
给父元素添加事件,点击子元素后,利用冒泡的原理,触发执行效果。
避免了重复添加事件
避免了dom元素的遍历次数
可以给未来元素添加事件
3. jsonp和ajax的区别,如何实现jsonp
jsonp和ajax的区别是ajax只能访问同源的网站,不能够进行跨域访问。
实现jsonp的方式是利用了html标签src属性不受同源策略的限制,可以跨域对非同源网站进行访问和获取数据。
4. http的常用请求头有哪些,请举例说明。
http的请求头:
Host:请求的地址端口/域名(不包括http协议)
Connection: 连接类型
User-Agent:浏览器信息
Accept:浏览器支持请求类型
Accept-Encoding:浏览器能处理压缩代码
Accept-Language:浏览器当前设置语言
5. 常见http状态码有哪些 举例说明。
100: 这个临时响应是用来通知客户端的,部分的请求服务器已经接受,但是客户端应继续发送求请求的剩余部分
200表示请求成功
304表示浏览器缓存
404表示路径错误
500表示服务器错误
6. 请简述闭包的应用场景,并编写一个闭包。
闭包是js特有的一种函数嵌套模式,会生成闭包作用域,使用闭包作用域保存变量。
优点:可访问到非自身作用域的变量,封闭作用域
缺点:生成闭包作用域,大量使用造成栈溢出
他的应用场景:防抖和节流
function a(b){
return (c)=>{
reutrn b+c;
}
}
7. 编写一个类 要求实例化的对象可以被 for-of 遍历
function fn(obj) {
obj[Symbol.iterator] = function* () {
let keys = Object.keys(obj);
for (let k of keys) {
yield [k, obj[k]];
}
}
for (let [k, v] of obj) {
console.log(k, v);
}
}
8. 使用 JS 编写一个queryString类 ,要求实现 stringify 和 parse 函数
let obj = { a: '5', b: 6 } function stringify(obj) { let str = “ ”; for (let i in obj) { let val = obj[i]; if (typeof obj[i] == "string") { val = '"' + val + '"'; } str += i + ':' + val + ','; } str = str.slice(0, -1); str += '}'; return str; } console.log(stringify(obj)); str = stringify(obj); function parse(str) { let obj = {}; str = str.slice(1, -1); str = str.replace(/(^\s)|(\s$)/, ''); let arr = str.split(','); for (let i = 0; i < arr.length; i++) { let arr1 = arr[i].split(':'); let val; if (arr1[1].charAt(0) == '"') { val = arr1[1].replace(/"/g, ''); }else if(arr1[1]=='true'){ val=true; }else if(arr1[1]=='false'){ val=false; }else if(arr1[1]=='undefined'){ val=undefined; }else if(arr1[1]=='null'){ val=null; }else if(Number(arr1[1])!=NaN){ val=Number(arr1[1]) } obj[arr1[0]] = val; } return obj; } console.log(parse(str));
9. 简述数据类型 Symbol 的作用并举例说明
Symbol是es6新增的一种基本数据类型,表示唯一。
常用来做对象的属性(唯一的key来访问属性值):
let s=Symbol();
let b={s:6} 只能通过s获取6
10. 如何阻止事件的默认行为和事件冒泡
e:事件对象
默认行为:e.preventDefault(); e.returnValue=false;
事件冒泡:e.stopPropagation(); e.cancalBubble=true;