整理自
在實際的專案應用中,typeof只有兩個用途,就是檢測乙個元素是否為undefined,或者是否為function。
value function typeof
-------------------------------------
"foo"
string string
new string
("foo") string object
1.2 number number
new number
(1.2) number object
true boolean boolean
new boolean
(true) boolean object
new date
() date object
new error
() error object
[1,2,3] array object
new array
(1, 2, 3) array object
new function
("") function function
/abc/g regexp object
new regexp
("meow") regexp object
{} object object
new object
() object object
object.prototype.tostring()
有乙個妙用,如果我們以某個特別的物件為上下文來呼叫該函式,它會返回正確的型別。我們需要做的就是手動處理其返回的字串,最終便能獲得typeof應該返回的正確字串。
可以用來區分:boolean
,number
,string
,function
,array
,date
,regexp
,object
,error
等等。
公認的靠譜解法是object.prototype.tostring.call(x) === '[object array]'
關於如何區分『如何區分null,陣列,和普通物件』
這一關最簡單,有100%靠譜的簡單解x === null
不多解釋
x instanceof array
看上去不錯?可惜這不是最佳答案!問題在於window.array
乃至.constructor
都不100%靠譜,因為x可能來自另外乙個frame!
公認的靠譜解法是
object.prototype.tostring.call(x) === '[object array]'
x.constructor === object
這個問題明顯:怕但由於constructor這個名字在js裡的特殊地位,真有人亂用這個名字可以去打他的pp
try catch(e) return true;
好長……簡單來說,就是可以被json化,又可以逆轉回來保持資訊不變,也就是判斷物件是不是個json安全的普通意義上的資料物件
jquery.isplainobject
原始碼,通過各種檢查努力排除了dom,jq,window物件,排除了絕大多數(並不100%)情況下new ***()
(***非object)出來的物件
後面這兩個比較起來,前者不排斥但後者排斥的有function a(){}; new a()
(有自定義構造器),後者不排斥但前者排斥的有}
(json不安全的成員)var a = {}; a.me=a;
(迴圈引用)
我的前端學習筆記 關於em和rem的使用
因為在公司以後都是移動端前端開發,傳統的用px作為單位顯然不切實際。因此我們要使用相對單位em和rem。這兩個其實沒什麼本質區別,只是相對的不一樣。em 是以父元素的字型大小為參照。比如父元素是12px,你給子元素1em,他其實就是12px長。下面舉例說明 這是html的結構 aa2b c賦給他們不...
前端js學習筆記 函式
函式使用分為兩步 宣告函式 和 呼叫函式 1.宣告函式 function 函式名 1 function是宣告函式的關鍵字,不能改動 2 函式不呼叫 自己不執行 2.呼叫函式 函式名 呼叫函式的時候一定要加小括號 3.函式的形參和實參 function 函式名 形參1,形參2 函式名 實參1,實參2 ...
前端學習筆記js篇(2)
1.和 js中 運算會先將兩邊的資料型別進行轉換,如 1 1 會先把 1 轉換成1,再進行比較,結果自然是true 而 運算是將兩邊的資料進行完全比較,資料型別和數值必須完全相同。因此1 1 結果自然是false 被比較值 b undefined null number string boolean...