1.JS的数据类型有哪些
原始类型:Number string Boolean null undefined symbol Bigint
对象类型:Object
2.原型的作用是什么
之所以存在原型,是因为JS语言要实现面向对象,而原型是面试对象的实现手段之一,一个能支持面向对象的语言必须做到一点:能判断一个实例得类型。再JS中 通过原型就可以知晓某个对象从属于那个类型,换句话说,原型得存在避免了类型得丢失。
3.GET和POST有什么区别?
从三个方面去说,
1)协议层面:也就是语义有差别,都是再请求的时候最先出现得单词,它可以表面客户端想要干嘛get表示我要拿东西。post表示我要提交东西
2)应用层面:再get和post发请求得时候 一般get得请求体是为空的 有请求体 只不过为空而已 而不是没有请求体 请求体就是 当你再发那个http报文得时候 第一行是请求行 后面就是键值对了也就是请求头 然后下面才是请求体 get是为空的
3)浏览器层面 1)get的参数会显示在浏览器地址栏中,而post的参数不会显示在浏览器地址栏中; (2)使用post提交的页面在点击【刷新】按钮的时候浏览器一般会提示“是否重新提交”,而get则不会; (3)用get的页面可以被搜索引擎抓取,而用post的则不可以;4)get请求得参数会保留在浏览器 post不会 5)在发送数据得时候,get向URL添加数据;URL得长度是受限制得 最大为2048个字符 post没限制
4.promise解决了什么问题?
1)首先promise没有完全消除回调,也没有完全消除回调地狱 比如 promise.then(()=>{}),它只是让回调变得可控了,promise其实最大的作用就是它统一了异步操作的实现 完全消除回调和消除回调地狱是再统一promise之后 再ES7衍生的那种 async 和await 最终才完全的消除回调和回调地狱。
5.什么是vue的响应式?
vue数据响应式设计的初衷是为了实现数据和函数的联动,当数据变化后,用到该数据的联动函数会自动重新运行,具体再vue开发中 数据和组件的render函数关联再一起 从而实现了数据变化自动运行render 再感官上就看到了组件的重新渲染,除了vue自动关联的render函数 其他还有很多使用到vue响应式的场景,比如computed、watch等等 不能仅把vue的数据响应式想象成和render的关联
6.如何理解JS的异步?
JS是一门单线程的语言,这是因为它运行再浏览器的渲染主线程里面,而渲染主线程只有一个,而渲染主线程承担着诸多的工作,渲染页面,解析HTML,解析CSS,执行JS等等 如果使用哦那个不的方式 就极有可能导致主线程产生阻塞,从而导致消息队列中的很多其他任务无法得到执行,这样一来,一方面会导致繁忙的主线程白白消耗事件,另一方面导致页面无法及时更新,给用户造成卡死现象 所以浏览器采取异步的方法来避免,具体做法是当某些任务发生时 比如计时器 网络 事件监听 主线程将其他任务交给其他进程去处理 自身立即结束任务的执行 转而执行后续代码 当其他线程完成时 将事先传递的回调函数包装成任务 加到消息队列的末尾派对 等待主线程调度执行 在这种异步模式下 浏览器永远不阻塞 从而最大限度的保证了单线程的流程运行。
7.阐述一下JS的事件循环
事件循环又叫做消息循环,是浏览器渲染主线程的工作方式在 Chrome 的源码中,它开启一个不会结束的 for 循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时候将任务加入到队列未尾即可。过去把消息队列简单分为宏队列和微队列,这种说法目前已无法满足复杂的浏览器环境,取而代之的是一种更加灵活多变的处理方式。
根据 W3C官方的解释,每个任务有不同的类型,同类型的任务必须在同一个队列,不同的任务可以属于不同的队列。不同任务队列有不同的优先级,在一次事件循环中,由浏览器自行决定取哪一个队列的任务。但浏览器必须有一个微队列,微队列的任务一定具有最高的优先级,必须优先调度执行。
8.JS中的计时器能做到精确计时吗?为什么?
参考答案:
不行,因为:
1)计算机硬件没有原子钟,无法做到精确计时
2)操作系统的计时函数本身就有少量偏差,由于 JS 的计时器最终调用的是操作系统的函数,也就携带了这2些偏差按照 W3C的标准,浏览器实现计时器时,如果嵌套层级超过 5层,则会带有 4 毫秒的最少时间,这样在计时时间少于4毫秒时又带来了偏差
3)受事件循环的影响,计时器的回调函数只能在主线程空闲时运行,因此又带来了偏差