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。