前端面试题

116 阅读4分钟

一、原型、原型链

原型

每个实例对象( object )都有一个私有属性(称之为__proto__ )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象__proto__ ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

JavaScript有句话,一切皆为对象,其实是不严谨的, 比如 null 和 undefined 就不是对象,除此之外,都是对象。Javascript 对象都有一个叫做原型的公共属性,属性名是__proto__。这个原型属性是对另一个对象的引用,通过这个原型属性我们就可以访问另一个对象所有的属性和方法。比如:

let Array = [1, 2, -1, 4, 3, 8]

image.png

总结: 每一个实例对象都有一个私有属性__proto__,指向它的构造函数的原型对象(prototype)。

原型链

原型链:每个被实例的对象都有__proto__对象,它指向了构造该对象的构造函数的 prototype 属性。同时该对象可以通过__proto__对象来寻找不属于自身的属性。

1.每个函数对象都有一个 prototype 属性,这个属性就是函数的原型对象。

2.原型链是 JavaScript 实现继承的重要方式,原型链的形成是真正的靠__proto__ 而非 prototype。

二、闭包

闭包就是有权访问一个函数内部变量的函数,也就是常说的函数内部嵌套函数,内部函数访问外部函数变量,从而导致垃圾回收机制没有将当前变量回收掉。这样的操作,有可能会带来内存泄漏。好处就是可以设计私有的方法和变量。

详解可参考:www.alloyteam.com/2019/07/clo…

闭包的应用场景:

  1. setTimeout原生的setTimeout有一个缺陷,你传递的第一个函数不能带参数就可以用闭包来实现传参效果;
  2. 回调;
  3. 函数防抖,节流;(防抖:函数被高频触发时停止触发后延时n秒再执行函数;节流:函数被高频触发时延时n秒才会执行)
  4. 封装私有变量;

三、js 跨域

目前暂时已知的跨域方法是:

  1. jsonp跨域,原理:script标签没有跨域限制的漏洞实现的一种跨域方法,只支持get请求。安全问题会受到威胁。
  2. cors跨域,通过后端服务器实现,Access-Control-Allow-Origin。
  3. postMessage window 的一个属性方法。
  4. websocket。
  5. nginx 反向代理。
  6. iframe 跨域。

还有一个跨域:

webpack proxy 跨域只能用作与开发阶段,临时解决本地请求服务器产生的跨域问题。并不适合线上环境。配置在webpack的devServer属性中。

webpack中的devsever配置后,打包阶段在本地临时生成了一个node服务器,浏览器请求服务器相当于请求本地服务。

四、get post 的区别

  • 对 get 和 post 区别的错误理解一:get安全性非常低,post安全性较高。
  • 对 get 和 post 区别的错误理解二:get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。

区别:

1. get是获取数据的,而post是提交数据的。
注:HTTP请求,最初设定了八种方法。这八种方法本质上没有任何区别。只是让请求,更加有语义而已。
  • OPTIONS 返回服务器所支持的请求方法;
  • GET 向服务器获取指定资源;
  • HEAD 与GET一致,只不过响应体不返回,只返回响应头;
  • POST 向服务器提交数据,数据放在请求体里;
  • PUT 与POST相似,只是具有幂等特性,一般用于更新;
  • DELETE 删除服务器指定资源;
  • TRACE 回显服务器端收到的请求,测试的时候会用到这个;
  • CONNECT 预留,暂无使用;
2. GET 用于获取信息,是无副作用的,是幂等的,且可缓存, 而POST 用于修改服务器上的数据,有副作用,非幂等,不可缓存。

当然还有关于 GET 和 POST 的 TCP 连接的问题,我不敢确定所以不敢瞎说,深入理解后,再来补上。 还有更多的区别,关于它们谁更安全啊?有没有限制啊?在上面的误区中已经写过了。 当然,GET和POST本质上并没有什么区别,GET和POST是就是HTTP协议中的两种发送请求的方法。

HTTP 是什么?HTTP是基于 TCP/IP 的关于数据如何在万维网中如何通信的协议。

HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是TCP/IP,也就是说,GET/POST 都是 TCP 链接。 GET 和 POST 能做的事情是一样的。你要给 GET 加上 request body,给 POST 带上 url 参数,技术上是完全行的通的。

五、this

六、作用域

七、函数节流和防抖