1、promise,promise.all与promise.race的作用和区别?
Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。(后续详更promise)
2、ES6新特性
2.1不一样的变量声明:const和let
Es6推荐使用let作为局部变量。
Const表示声明常量,值设置完成后就不能再被修改了。Let和const都是块级作用域。
如果const是一个对象,对象所包含的值是可以修改的,例如修改属性或数组啥的可以,但对象所指向的地址还是没有变的。
有几个点还是需要注意一下:
- Let关键词声明的变量不具备变量提升特性,不能重复声明,不影响作用域链。
- Const在声明时必须赋值,声明时使用大写变量。
2.2模板字符串
在es6之前经常通过“\”和“+”来构建模板,引引加加啥的
" + name + ", " + seatNumber + ", " + sex + " and so on."
而现在的es6:基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来完成拼接;ES6反引号(``)直接搞定;
2.3箭头函数
ES6 中,箭头函数就是函数的一种简写形式,使用括号包裹参数,跟随一个 =>,紧接着是函数体;
不需要 function 关键字来创建函数
省略 return 关键字
继承当前上下文的 this 关键字
细节:当你的函数有且仅有一个参数的时候,是可以省略掉括号的。当你函数返回有且仅有一个表达式的时候可以省略{} 和 return;
2.4函数的参数默认值
2.5Spread和rest操作符2.6
2.6二进制和八进制字面量
- 二进制用0b,八进制用0o。
- 2.7对象和数组解构(对象和属性简写)
- 2.8对象超类
ES6 允许在对象中使用 super 方法:
2.9 for…of和for…in
for...of 用于遍历一个迭代器,如数组:
for...in 用来遍历对象中的属性:
2.10 Es6中的类
类的声明不会提升(hoisting),如果你要使用某个 Class,那你必须在使用之前定义它,否则会抛出一个 ReferenceError 的错误。
在类中定义函数不需要使用 function 关键词。
2.11模块化(module)
ES5不支持原生的模块化,在ES6中模块作为重要的组成部分被添加进来。模块的功能主要由 export 和 import 组成。每一个模块都有自己单独的作用域,模块之间的相互调用关系是通过 export 来规定模块对外暴露的接口,通过import来引用其它模块提供的接口。同时还为模块创造了命名空间,防止函数的命名冲突。
Es6将一个文件视为一个模块,export能导出多个函数、变量和常量。
定义好一个模块的输出以后,就可以在另一个模块通过import导入,一条·import语句可以同时导入默认函数和其他变量。
2.12 Promise
Promise 是异步编程的一种解决方案,比传统的解决方案callback更加的优雅。
官方描述:一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知的值。它让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。(后续会详细更新promise用法)
3、网络攻击的几种方式,如xss,csrf等,如何预防
客户端攻击2种
- xss攻击:跨站点脚本攻击(Cross Site Script),缩写为了不和css混淆写成xss,意思就是更改js和html进行攻击,有反射性xss攻击,持久性xss攻击和dom xss。
防御方式有:对输入的数据做过滤处理
2.CSRF攻击:攻击者通过跨站请求以合法身份进行非法操作。简单的说就是借刀杀人,盗取用户身份干些见不得人的操作。
防御方式:header加token:在请求参数中加随机数阻止攻击者获得参数
验证码:简单暴力,就是用户体验较差
请求地址验证:ip校验
httponly:阻止js访问cookie
samesite:防止跨域请求
服务端攻击2种
- SQL注入:攻击者在http请求中恶意注入SQL命令,服务器用请求参数构造SQL命令时,恶意SQL命令也被一起构造了,(恶意SQL命令在里面浑水摸鱼)然后在数据库中执行。
防御方式:使用预处理 PreparedStatement。(JDBC预处理)
使用正则表达式过滤掉字符中的特殊字符。(过滤)
Mybatis下注入防范,JPA注入防范
目前许多数据访问层框架,如IBatis,Hibernate等,都实现SQL预编译和参数绑定,攻击者的恶意SQL会被当做SQL的参数,而不是SQL命令被执行。
2.DoS攻击:Denial of Service的简称,就是拒绝服务,就是让计算机或网络无法提供正常的服务。
防御方式:验证码:粗暴,用户体验差
限制请求频率:根据IP地址和Cookie等信息,计算客户端的请求频率并进行拦截。
4、如何判断数据类型:typeof,instanceof,toString
typeof() 部分类型需要结合一下判断来使用,比如数组,正则,日期,null等等。typeof 目前能返回string,number,boolean,symbol,bigint,unfined,object,function这八种判断类型,判断不完全。
instanceof一般用来判断引用数据类型的判断,如:Object,Function,Array,Date,RegExp等。
Constructor。
判断最准确的方法是Object,prototype.toString。toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,返回格式[object,数据类型]。
5、深拷贝和浅拷贝
浅拷贝:浅拷贝就是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。(连对象地址都考过来了,还得连带责任)
深拷贝:深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。(就是重新建了个东西,和原来的断清楚关系了)。
赋值:赋的其实是该对象的在栈中的地址,而不是堆中的数据。
6、http缓存
HTTP 缓存机制就是,配置服务器响应头来告诉浏览器是否应该缓存资源、是否强制校验缓存、缓存多长时间;浏览器非首次请求根据响应头是否应该取缓存、缓存过期发送请求头验证缓存是否可用还是重新获取资源的过程。
7、跨域的几种方式和原理
协议+域名+端口一样的叫同源,有一个不一样就叫跨域。
解决:CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案
JSONP只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
不管是Node中间件代理还是nginx反向代理,主要是通过同源策略对服务器不加限制。
日常工作中,用得比较多的跨域方案是cors和nginx反向代理。
文章难免有不足之处,欢迎评论指正提意见。