由一次代码优化想到的Js 数据类型
引子:
上周三進(jìn)行了代碼優(yōu)化,其中有一個很普遍的代碼,例如:
if(test =="") {dothis();}else{dothat()} ----->可以簡化為 !test ? dothis():dothat();
if(test =="") {dothis()} ----->可以簡化為 !test&&dothis();
看這個問題簡化的根源,其實(shí)就是對test的值進(jìn)行判斷,判斷是否為false或者是true,如果test==""就執(zhí)行dothis()這個函數(shù),這個其實(shí)就是類型的判斷問題,看來""就是一個false,于是我聯(lián)想,還是其他的嗎?
是有的,比如0,false,null,undefined,NaN,我寫了一個例子來測試下:
<!DOCTYPE HTML> <html > <head><meta charset="gbk"><title></title><script type="text/javascript">if(false || null || undefined || '' || 0 || NaN){alert(1);}else{alert(2);}</script> </head> <body> </body> </html>上述代碼我在各個瀏覽器下輸出為結(jié)果2,可見js中是將這6種類型的值當(dāng)做false的,還有沒有其他的,目前我只想到這些,不過由這個的變體有很多,應(yīng)用也很多,在函數(shù)中,對語句中等等的。。
Js 數(shù)據(jù)類型
對于這個主題,首先來看幾個問題,如果你對這幾個問題很清楚的話,那就請直接跳過吧,不用接著往下看了,如果不清楚,建議你還是看看。
1)如果判斷函數(shù)?function 和object的聯(lián)系是什么?
2)typeof 和instanceof 的區(qū)別是什么和作用是什么?
3)undefined 和null 有什么區(qū)別?
4)js 有哪幾種基本的數(shù)據(jù)類型?
5)Undefined,undefined,’undefined’分別是什么?
6)typeof null ?,null instanceof Object 的值是什么
關(guān)于類型,不同的書上有很多的不同的說法,
首先看看ECMA 是怎么說的,ECMA262-5上說 ECMAScript的類型是Undefined,Null,Boolean,String,Number,Object,每種類型對應(yīng)一種值,分別是undefined,null,true/false, "elements",number,
a collection of prototies,每種類型都有一個對應(yīng)的值,分別為 ‘undefined’,'null','boolean','string','number','object'.這種說法不能解釋function 是什么類型,null 和undefined 的區(qū)別
javascript高級教程第一版(p11頁)中說,js只有5中原始的基本數(shù)據(jù)類型(Undefined,Null,Boolean,String,Number),很明顯不對。那么,對象是是什么呢?到第二版中,將Object增加進(jìn)來了,說Object是
一種復(fù)雜的數(shù)據(jù)類型。所有的值都將是上述6種類型之一,我覺得這種說法還靠譜一點(diǎn),但是如果 是函數(shù)呢?這就說不清楚它屬于哪一類了。
aimingoo 提到j(luò)avascript中兩套類型系統(tǒng),一個是基本數(shù)據(jù)類型,另外一個是對象類型系統(tǒng),基本數(shù)據(jù)類型包括6種,分別是undefined,string,null,boolean,function,object,基本數(shù)據(jù)類型是通過typeof
來檢測的,對象類型系統(tǒng)是以基礎(chǔ)類型系統(tǒng)為基礎(chǔ)的,對象類型系統(tǒng)通過instanceof來檢測,對象類型與基本數(shù)據(jù)類型存在著對應(yīng)的關(guān)系,例如String->sting, Boolean-> boolean,Number->number,他們只是映射,本質(zhì)上
是不同的,undefined,string,null,boolean 是值類型的。function,object 是引用類型的。String,Boolean,Number 類均是object類型,是Object的子類。Function() 也是引用類型,所有的引用類型均是Object的子類。
我覺得通過兩套類型系統(tǒng)理解js中的數(shù)據(jù)類型是比較靠譜的。首先它通過typeof 和instanceof 來區(qū)別基本數(shù)據(jù)類型和對象類型,不同的對象類型通過 a instanceof Type 來判斷是否是其相應(yīng)的類型,
例如:alert(typeof null ) 結(jié)果是 “object”,但是alert(null instanceof Object) ?結(jié)果是false 這個說明null 是對象,但是它不是Object的子類,其次,它能夠解答 “aaaa”.length為什么是4,這個是一個裝箱操作,
當(dāng).運(yùn)算符發(fā)現(xiàn)左邊的操作數(shù)是一個“值類型”數(shù)據(jù)時,會隱式地調(diào)用Object(x)過程將它轉(zhuǎn)為對象,于是"aaaa".length 將被隱式地轉(zhuǎn)化為 String("aaaa").length,而String() 是有l(wèi)ength 屬性的,所以有這個值4
回到本文開始處的幾個問題,很明顯都可以解釋了:
1)如果判斷函數(shù)?function 和object的聯(lián)系是什么?
? 通過typeof 來判斷,function和object都是引用類型,函數(shù)的基本數(shù)據(jù)類型,object是對象類型,function是object的子類
2)typeof 和instanceof 的區(qū)別是什么和作用是什么?
typeof 用來判斷基本數(shù)據(jù)類型,instanceof 來判斷對象類型, 但function 有點(diǎn)特殊 alert(typeof function(){}) //"function" ?alert(function(){} instanceof Object) ?//true
3)undefined 和null 有什么區(qū)別?
一個是值類型,一個是引用類型
4)js 有哪幾種基本的數(shù)據(jù)類型?
6種:undefined,boolean,string,number,object,function
5)Undefined,undefined,’undefined’分別是什么?
Undefined 是類型,undefined 是值,’undefined‘是類型的名稱
6)typeof null ?,null instanceof Object 的值是什么
’object‘ ?,false
歡迎大家拍磚。
轉(zhuǎn)載于:https://www.cnblogs.com/yupeng/archive/2012/05/22/2512077.html
總結(jié)
以上是生活随笔為你收集整理的由一次代码优化想到的Js 数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在查询的结果中添加自增列 两种方法
- 下一篇: 楚乔传乌先生真实身份揭秘 乌道涯跟楚乔是