? ? ? ??本文需要5分鐘左右閱讀完成,建議收藏以后閱讀,里面都是干貨,可以親自試驗一下,如果覺得好用可以幫忙點贊轉(zhuǎn)發(fā)一下讓更多人看到,謝謝!交流學習java大數(shù)據(jù)可以加群460570824。
js的語法比java簡單,但是我總感覺js代碼看的很吃力,學的也很郁悶。現(xiàn)在買了本javascript權(quán)威指南,打算從頭學起。這里就順便當做筆記了。
程序設(shè)計首先得搞明白數(shù)據(jù)類型。js中有數(shù)字、布爾值、字符串、函數(shù)、對象、數(shù)組、null、undefined這幾種類型。
關(guān)于數(shù)字:
js的數(shù)字并不區(qū)別整型還是浮點型,js中所有數(shù)字都是浮點型表示,可以認為是其他語言中常用的double型。另外js能識別十六進制和八進制的直接量。如0xff(0x開頭為十六進制),0377(0開頭為八進制數(shù),但是最好不要這么蛋疼的用)。通常咱無論整數(shù)還是浮點數(shù)都直接在js中用就ok。js還支持指數(shù)計數(shù)法表示的浮點型直接量,如6.02e23//e23就是10的23次方。數(shù)字除了支持—、+、*、/,js還有很多算數(shù)函數(shù)保存在Math對象中。
特殊的數(shù)值有Infinity無窮大,負無窮大則是-Infinity,還有NaN,意為非數(shù)值??梢杂靡粋€專門的函數(shù)isNaN()來檢測這個值。還有isInfinity();
關(guān)于字符串:
js支持Unicode字符,注意js沒有char類型,所有字符都是字符串。用""或者''括起來。如果字符串中包含"或者',注意使用\轉(zhuǎn)義。js字符串的內(nèi)部特性之一就是支持+連接字符串。字符串有l(wèi)ength屬性,還有charAt()方法。還有subString(start,end)方法,indexOf('')方法。
數(shù)字轉(zhuǎn)換成字符串:
當數(shù)字與字符串做+運算時,數(shù)字會轉(zhuǎn)換成字符串。如100+”萬"結(jié)果就是"100萬"。由此可以得出一個將數(shù)字轉(zhuǎn)化成字符串的簡便方法,如var n=100; n=n+'';則n就轉(zhuǎn)化成了字符串。''就是一個空字符串。其他的顯式轉(zhuǎn)換可以使用String(number)方法。還可以使用number.toString()方法,這個得是Number對象(似乎數(shù)字就是Number對象),該方法有參數(shù),用來如2、8、16,表進制。還可以調(diào)用toFixed()方法格式化顯示數(shù)字。
字符串轉(zhuǎn)換成數(shù)字:
當字符串用于數(shù)字環(huán)境中時,它會自動轉(zhuǎn)換成數(shù)字。比如var n= '2' * '33'。則n的值為數(shù)字66。利用這個特點,將字符串轉(zhuǎn)數(shù)字的簡便方法就是var s='55';s=s-0;則s就變成了數(shù)字55。切記如果是給字符串+0,那么這個運算過程就是字符串連接,相當于+'0'。
要允許更靈活的轉(zhuǎn)換,可以使用parseInt()和parseFloat()。具體用法見書本p38.
布爾值:
沒什么好說的,true和false。關(guān)于布爾值的轉(zhuǎn)換,往往是自動轉(zhuǎn)換。用于數(shù)字環(huán)境,true為1,false為0。用于字符串環(huán)境,則true為'true',false為'false'。值得注意的是,如果一個數(shù)字用于布爾值環(huán)境,那么如果該數(shù)字是0或者NaN,它就轉(zhuǎn)成false,否則為true。而如果是字符串用于布爾值環(huán)境,則空字符串為false,非空為true。空值和未定義的值也會被轉(zhuǎn)成false,而任何非空對象、數(shù)組、或函數(shù)都轉(zhuǎn)換成true。
如果想顯式轉(zhuǎn)換,使用Boolean(x)函數(shù)。還有一種簡便方法是!!運算符。不解釋。
函數(shù):
通常的定義方式為function square(x){
returnx*x;
}
得有個function關(guān)鍵字。有一點必須特別強調(diào),在js中函數(shù)是真正的數(shù)值,它可以被存儲在變量、數(shù)組、對象中,而且函數(shù)還可以作為參數(shù)傳遞給其他函數(shù)。當函數(shù)被賦值給某個對象的屬性時,那么就等于該對象有了一個對應(yīng)屬性名的方法。
關(guān)于方法與函數(shù)的區(qū)別,我自己粗陋的理解為類外面的叫函數(shù),類里的叫方法。所以java沒有函數(shù)只有方法,因為java一切都在類里。而C和C++就有函數(shù)。
函數(shù)也可以有直接量,如:
var square=function(x){return x*x;}
這個特性比較重要。
還有一種蛋疼定義函數(shù)法:
var square =newFunction{"x","returnx*x"};//火星人喜歡這么用,地球人忘了它吧
對象:
js中的對象可以作為關(guān)聯(lián)數(shù)組使用。如果采用這種方式,那么訪問對象的屬性就要采取不同的語法。比如image.width,此時可以用image["width"]。
對象也有直接量,比如:
var point = {
x:2.3,y:-1.2};對象直接量也可以嵌套。最后要說明的是對象直接量使用的屬性值不必是常量,它可以是任意js表達式。而且對象直接量中的屬性名可以是字符串而不是標識符。哈哈這不就是json格式嗎?
對象轉(zhuǎn)換:
當非空對象用于布爾環(huán)境時,它自動轉(zhuǎn)換成true。當對象用于字符串環(huán)境,js會調(diào)用該對象的toString()方法,并且使用該函數(shù)的返回值。當對象用于數(shù)字環(huán)境,js首先調(diào)用該對象的valueOf()方法。如果該方法返回一個基本類型的值,則這個值會被使用。然而大多數(shù)情況下valueOf()返回的是對象自己,故js首先使用toString(),然后valueOf()。
數(shù)組:
js的數(shù)組可以存放任意js類型。包括其他數(shù)組、對象或者函數(shù)的引用。關(guān)聯(lián)數(shù)組與常規(guī)數(shù)組是有區(qū)別的,常規(guī)數(shù)組用數(shù)字下標,關(guān)聯(lián)數(shù)組則用字符串作下標。由于js是非類型語言,故數(shù)組中的元素類型不必一致。
數(shù)組聲明:var arr= new Array();然后可以單獨為每個元素賦值。也可以在聲明時賦值:new Array(1,'ok',3,true,{x:1,y:4});
js數(shù)組感覺就是java中數(shù)組與Arraylist的結(jié)合體。兼具兩者優(yōu)點。
如果只向Array()構(gòu)造函數(shù)傳遞一個參數(shù),那么該參數(shù)是指定數(shù)組的長度。
數(shù)組也有直接量,比如:
var array =[1.2,'javascript',true,{x:1,y:2}];
數(shù)組亦可嵌套:
varmatrix=[[1,2,3],[4,5,6],[7,8,9]];雖然js不支持多維數(shù)組,但是這么一嵌套,就成了多維數(shù)組。而且js中數(shù)組直接量的元素不必僅限于常量,它可以是任意表達式:
var base=3;
var table=[base,base+1,base+2];
甚至你可以在數(shù)組中存放未定義的元素,比如var unkown=[1,,5];//2號元素就是未定義的
這么寬松的語法正是js令我頭痛之處啊,郁悶。當然這也是js強大之處。
null:
沒啥說的,當它處于bool環(huán)境時它被轉(zhuǎn)換成false,當用于數(shù)字環(huán)境時它被轉(zhuǎn)換成0;當用于字符串環(huán)境,它被轉(zhuǎn)換成'null'。
undefined:
js偶爾會用一下這個。在使用了一個并未聲明的變量時,或者使用了已經(jīng)聲明但是沒有賦值的變量時,又或者使用了一個并不存在的對象屬性是,返回的就是undefined。注意它并不等同于null。但是==運算符卻將兩者看做相等。如果你想?yún)^(qū)分null和undefined,可以使用===運算符和typeof運算符。
undefined還有一點與null不同,null是js的保留字,而undefined不是。它是js的一個全局變量,它的初始值是undefined。
當用于布爾環(huán)境,false。用于數(shù)字環(huán)境,NaN。用于字符串環(huán)境,'undefined'。
js中也有Date對象。還支持正則表達式,RegExp對象,它支持直接量,一對斜線/這是正則表達式/之間的文本就是一個正則表達式直接量。js也有Error對象。
詳細的類型轉(zhuǎn)換對照表可以參考書本P47。
看到j(luò)s的語法是如此的寬松,你是否想到了js代碼的各種稀奇古怪的寫法了呢?