前端面试知识点(三)
1、类型转换问题([] == ![])
可能有的童鞋已经知道了答案,可能还有些人还存在一丝疑惑,没关系下面我们一步步来讲解。
首先,问题的答案是:true 那么为什么呢?
在js中比较基本数据类型(除了es6中Symbol)都可以很轻松的比较出来,但是一涉及到对象的比较就有点棘手啦。在此之前你得清楚js中的 == 和 === 之前区别。
先转换再比较相等 —— ==
直接比较是否全等,不发生类型转换 —— ===
"1" == 1 // true
"1" === 1 // false
隐式转换:
- -、*、/、% :一律转换成数值后计算
-‘+’情况下:
- 数字+字符串 = 字符串 => 1+“2”=12
- 数字+boolean/null(0) = 数字 => 2+true=3
- 数字+undefined(会转为NaN) = NaN
js中值为false的属性:null,undefined,NaN,” ”,false,0,-0,其余为true
关系运算:
数值按大小比较;
字符串按Unicode编码比较;
其中为一个数值则将另一个转为数值;一个是布尔值则先转为数值再比较;
一个是对象则先调用valueOf -> toString,再按上述比较;
为大佬们呈上一副比较不错的图片
ok,有了上面的基础知识讲解后,就可以来解开问题的神秘面纱啦,[]!==[]肯定为真
1、 这个表达式中可以看到存在 ‘!’,它优先级要比 ‘==’ 的级别高,so,先计算右边式子
其中,“ !,&&,|| ” 操作符在运算的时候会先调用Boolean(),再进行运算
Boolean([]) // true
取反:!true 为false,所以右边表达式为false
2、 再计算左边,此时表达式为 [] == false(存在一个布尔值,先转为数字再比较)
此时表达式为:[] == 0;
根据关系运算比较规则:一个为数值,一个为布尔值,将布尔转为数字再比较
[].toString()=>""(空串)
“”(空串)=> 0
噔 噔 噔 :0 == 0 => true (大家可以思考一下 {} == !{})
2、&& 和 ||
1、逻辑与 &&
- 符号两边都为true时,返回true
- 符号两边任意一边为false时,返回false
- 支持短路运算,第一个条件为false时,不再判断后面条件
2、逻辑非 ||
- 只要有一个条件为true时,结果就为true
- 当两个条件都为false时,结果才为false
- 支持短路运算,第一个条件为true时,不再判断后面条件
关于短路运算:
'||':符号前面值为false,无论符号后面是否为true/false,返回符号后面的值
0 || 5 =>5
'||':符号前面值为true,无论符号后面是否为true/false,返回符号前面的值
1 || 5 =>1
'&&':符号前面的值为false,无论符号后面的是否为true/false,返回符号前面的值
0 && 2=>0
'&&':符号前面的值为true,无论符号后面的是否为true/false,返回符号后面的值
1 && 5=>5
3、cookie的生成过程
想要知道cookie的生成过程,必须要先了解cookie是是什么?主要用来干什么?
cookie是什么
http是无状态协议,再完成一次请求-响应后就会断开连接;再次请求,再次连接。这说明服务器但从请求中是无法知道请求者的身份的。设置cookie后,客户端每次请求的时候都会带上用户的sessionid,相当于一个身份证,再次请求的时候服务器先验证然后做出响应的回应。
cookie的类型
cookie的类型有会话cookie和持久性cookie。会话cookie是在一次请求-响应结束后就会消失;持久性cookie是通过设置cookie的Expires值或者设置有效期(Max-Age)
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2019 07:28:00 GMT; //时间格式要注意
生成流程
- 客户端第一次请求服务器的时候,服务器端生成Sessionid和Set-Cookie报文头,放在HTTP报文中,返回给客户端
- 客户端收到后,读取Set-Cookie中的内容,并保存的本地的cookie文件中,下次再请求服务器时,请求头中会携带cookie
- 服务器端收到请求,会检索Cookie和用户信息,并返回请求页面
在我不是很了解cookie之前会有个疑问,客户端每次请求的时候都会带上cookie,那么第一次请求的时候会带上吗?
答案是否定的。因为cookie是由服务器端生成的,第一次请求的时候服务器会生成Set-Cookie然后把信息返回给客户端,浏览器再进行存储,再次请求就会带上cookie。