js题目01

103 阅读3分钟

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;