每日一题

319 阅读4分钟

2022.3.22

1.什么情况下会遇到跨域,怎么解决?

域:协议 + 域名 + 端口 只要这三者有一个不同就属于跨域。

因为浏览器为了安全考虑,防止xss和csrf攻击。

XSS:即 Cross Site Script,中译是跨站脚本攻击;其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS。

XSS 攻击是指攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式

CSRF:即 Cross Site Request Forgery,中译是跨站请求伪造,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。

通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下的操作。

xss和csrf的详解以及解决办法:github.com/dwqs/blog/i…

解决跨域的方法:

  • 前端最常用的就是在开发dev模式下,通过webpack的配置proxy代理的形式解决(proxy只在开发模式生效,上线打包后还是需要通过后端的跨域策略)
  • CORS即后端通过res.headers 设置Access-Control-Allow-Origin 这个说明哪些域可以请求
  • 后端设置nginx反向代理原理和前端设置proxy类似

总结:解决跨域基本前后端会同时设置,前端最常用的就是在dev配置proxy,此外还有jsonnp,通过HTML5的postMessage方法跨域。

2.Map Object weakMap的区别?

map和object的比较

  • 传统的Object只能用string或者symbol作为key,而map的key可以是任意值包括函数,对象以及任意基本类型
  • map默认创建的时候不包括任何键,只能通过后续的set()设置,而object它的原型上面会有自带的默认属性名,所以创建的object键名可能会和原型上的键名冲突
  • Map数据它插入的key是有序的,而object的key是无序的
  • Map的size可以通过.size属性获取,object的键值对个数需要循环计算
  • Map也可以通过for of迭代,它有iterable属性
  • 在频繁增删键值对的情况下Map的性能更好

Map的方法有set() get() has()--判断一个键是否在Map中 delete() clear

什么是weakMap? weakMap只能对象作为键名(null除外),且weakMap键名引用的对象是弱引用

什么是强引用?

image.png 这里 arr对e1和e2的引用就属于强引用,当我们不再需要这两个对象时,我们必须手动的删除这个引用,解除arr都两个对象的引用关系,否则垃圾回收机制不会释放e1e2占用的内存。因为,arr仍然存在着对对象的引用! 就会造成内存泄露

总的来说, WeakMap 保持了对键名所引用的对象的弱引用,即垃圾回收机制不将该引用考虑在内。只要weakMap的key的那个对象被删除了,垃圾回收就会释放那个对象的内存,因为weakMap和那个对象key之间不存在引用了(弱引用就相当于不存在)

map和weakMap的区别

  • Map 的键可以是任意类型,WeakMap 只接受对象作为键(null除外),不接受其他类型的值作为键
  • map的键是强引用关系,是跟内存地址绑定的,只要内存地址不一样,就视为两个键; weakMap的键是弱引用,键的那个对象被删除以后的它占用的内存可以被垃圾回收
  • Map可以遍历,weakMap不能遍历

3.Promise为啥能被链式调用?

因为promise的then()每次都会返回一个新的promise对象

2022.3.24

1. 为什么说js中函数是一等公民?或者说函数为何是第一类对象

答:在编程语言中,一等公民需要具备几个条件:可以作为函数的参数,可以作为函数返回值,可以赋值给变量 因为 JavaScript 中函数也是对象,函数拥有对象的所有能力,也因此函数可被作为任意其他类型对象来对待。

当我们说函数是第一类对象(一等公民)的时候,就是说函数也能实现对象的全部功能

2022.3.25

待定