分享一道筆試題:
let x = ,
valueof()
}console.log(x == '20');
console.log(x == 30);
複製**
答案是false true 為什麼?
讓我們回到紅寶書中,對於相等描述符是這樣表述的:
==是相等操作符,如果兩個運算元相等,則返回true,而不相等操作符由嘆號後更等於號(!=)表示,如果兩個運算元不相等,則返回true,這兩個操作符都會先將運算元強制轉換,再進行比較。 一般遵循下面規則:之後就是字串與數值比較,字串先轉換為數值,然後判斷就可以了。
其實對於這道題,就延伸出了js中乙個令大家都感到頭疼的型別轉換!! 那我們就來看看吧!
原始值到原始值(數字,字串,布林值)的轉換
原始值轉化為布林值,所有的假值("undefined","null",0,-0,nan,"")都會被轉化false,其他都會被轉化為true.
原始值轉換為字串相當於加""
原始值轉化為數字,布林轉文字:true --> 1,false --> 0 字串轉數字,只有字串中都是以數字表示的,就可以直接轉換為字串,如果兩個數字間有空格的話,那麼轉換結果就是nan.
+"123" //123
+"1 3" // nan
複製**
物件到原始值的轉換
物件轉換為布林值都是true
物件到字串
否則就報錯。
+運算子如何進行型別轉換。
如果作為一元運算子就是轉化為數字,常常用來將字串轉化為數字。
+「2」 //2
複製**
如果作為二元運算子就有兩種轉換方式
讓我們來看看一道經典題目吧!
(! + + + !).length
複製**
運算順序應該是這樣的:
首先,!會轉換為"false", +會轉換為0,此時式子變成
!0 + + false
複製**
!0 轉換為 true,此時式子變成 true + + false
第三步中間的 會轉為空字串,在+ 運算子如何進行型別轉化
第二條的第三點,物件會被轉化為原始值,就是空字元,所以經過第三步之後就會變成
"true" + false
複製**
"truefalse"
複製**
"truefalse".length = 9
複製**
可能你看到這裡就有點疑問,為什麼!是false?
邏輯非運算子
簡單的來說,就是首先把資料轉化為布林值,然後取反,結果為true或false。 根據規則: 原始值轉化為布林值,所有的假值("undefined","null",0,-0,nan,"")都會被轉化false,其他都會被轉化為true. 所以! = !true = false
tostring和valueof方法
上面不止一次的提到了tostring和valueof方法,那這到底是怎麼計算的?
總結一波
undefined == null,結果是true。且它倆與所有其他值比較的結果都是false。
string == boolean,需要兩個運算元同時轉為number。
string/boolean == number,需要string/boolean轉為number。
object == primitive,需要object轉為primitive(具體通過valueof和tostring方法)。
寫在最後
//大坑
console.log ( == 0 );//true
console.log ( ! == 0 );//true
//神坑
console.log ( == ! );//true
console.log ( == );//false
//史詩級坑
console.log({} == !{});//false
console.log({} == {});//false
複製**
好好思考一下上面的坑吧! 筆試題中的必勝策略
比如,題目是這樣的 現在有兩堆石子,小今與小條玩遊戲,2個人都足夠聰明,兩個人規定 每次每人只能從其中一堆中取走1個或2個或3個石子,最後將石子全部取完的人勝利.現在兩堆石子的個數為8和9,請問如何安排才能讓小今必勝?答案是 讓小今先取。其實這裡是有規律可循的,可歸結為 取餘制勝 詳解如下 一 取餘...
C語言筆試題中的「坑」
其實這話說的不對,應該說不只是c語言,恐怕是面試題總會有那麼一些坑等著我們踩,今天,就羅列了一些看似簡單,卻很容易中招的面試題 1 以下程式的執行結果為。inlcude define n 2 define m n 1 define num m 1 m 2 main a 5b 6c 8d 9 嘿嘿,當...
catalan數在筆試題中的應用
令h 0 1,h 1 1,catalan數滿足遞推式 1 h n h 0 h n 1 h 1 h n 2 h n 1 h 0 n 2 例如 h 2 h 0 h 1 h 1 h 0 1 1 1 1 2 h 3 h 0 h 2 h 1 h 1 h 2 h 0 1 2 1 1 2 1 5 另類遞推式 2 ...