計(jì)算機(jī)程序的運(yùn)行需要對(duì)值進(jìn)行操作,在編程語(yǔ)言中,能夠表示并操作的值得類型稱為數(shù)據(jù)類型。變量用來(lái)將值存儲(chǔ)起來(lái),變量是值得符號(hào)名稱。
一、數(shù)據(jù)類型
JavaScript的數(shù)據(jù)類型可以分為兩類,原生類型和對(duì)象類型,JavaScript的原始類型包括數(shù)字、字符串和布爾值,JavaScript還有兩個(gè)特殊的原始值null(空)和undefined(未定義),它們不是數(shù)字、字符串和布爾值。對(duì)象類型包含普通對(duì)象、數(shù)組、函數(shù)、日期、正則、錯(cuò)誤對(duì)象。
JavaScript的類型也可以按有無(wú)方法分,除了null和undefined,其他的類型都是擁有方法的值,字符串、數(shù)字、布爾值在使用方法時(shí),會(huì)臨時(shí)轉(zhuǎn)化為對(duì)應(yīng)的對(duì)象。
JavaScript的類型也可以可變類型和不可變類型,只有對(duì)象和數(shù)組屬于可變類型,其他的都是不可變類型,包括字符串。
二、JavaScript的內(nèi)存管理機(jī)制
JavaScript解釋器有自己的內(nèi)存管理機(jī)制,可以自動(dòng)對(duì)內(nèi)存進(jìn)行垃圾回收。這意味著程序員可以按需創(chuàng)建對(duì)象,程序員則不必?fù)?dān)心這些對(duì)象的銷毀和內(nèi)存回收,當(dāng)不再有任何引用指向一個(gè)對(duì)象,解釋器就會(huì)知道這個(gè)對(duì)象沒(méi)用了 ,然后就自動(dòng)回收它所占的內(nèi)存資源。
三、數(shù)值
a、JavaScript中數(shù)值有整型和浮點(diǎn)型
整型可以用十進(jìn)制和十六進(jìn)制(0xff).
浮點(diǎn)型可以包含小數(shù)點(diǎn),可以采用傳統(tǒng)寫法,還可以使用指數(shù)計(jì)數(shù)法。
3.14
6.02e23 //6.02x1023
6.02E-23 //6.02x10-23
b、JavaScript中的算術(shù)運(yùn)算
JavaScript運(yùn)算符包括+、-、*、/、%(求余).除了基本的運(yùn)算符外,Javascript還支持更復(fù)雜運(yùn)算。這些運(yùn)算和Math對(duì)象的屬性和方法有關(guān)。
Math對(duì)象的屬性
Math對(duì)象的方法
例子:
Math.round(Math.random()*10) //返回0到10(包含0和10)的整數(shù)
溢出:當(dāng)數(shù)值超出了JavaScript所能表示的數(shù)字上限(溢出),結(jié)果為一個(gè)無(wú)窮大值。表示為Infinity。
當(dāng)負(fù)數(shù)超出了JavaScript所能表示的負(fù)數(shù)范圍,結(jié)果為負(fù)無(wú)窮大。表示為-Infinity。
基于無(wú)窮大的加減乘除讓是無(wú)窮大,保留其原來(lái)的符號(hào)。
下溢:當(dāng)運(yùn)算結(jié)果無(wú)限接近0且比JavaScript所能表示的最小值還小時(shí)發(fā)生下溢。這種情況下JavaScript返回0。正數(shù)下溢返回0;負(fù)數(shù)下溢返 回-0;0和-0幾乎沒(méi)有區(qū)別(除了作為除數(shù))?!?/span>
1 var a=0;2 var b=-0;3 console.log(a===b); //true4 console.log(1/a===1/b) //false
被0整除并不會(huì)報(bào)錯(cuò)?!?/span>
1 var a=1;2 console.log(a/0); //Infinity3 console.log(a/-0); //-Infinity4console.log(0/0) //NaN
NaN(not -a-number)://表示不是一個(gè)數(shù)字
0/0、無(wú)窮大除無(wú)窮大、給負(fù)數(shù)開(kāi)偶次方、算術(shù)運(yùn)算符的操作數(shù)不是一個(gè)數(shù)字或者無(wú)法轉(zhuǎn)化成數(shù)字(+運(yùn)算符特殊)。
1 console.log(0/0); //NaN2 console.log(Infinity/Infinity); //NaN3 console.log(Math.sqrt(-3)) //NaN4 console.log('a2'-3); //NaN
Infinity和NaN是JavaScript中定義的全局變量。
NaN和任何值都不相等,包括自身。所以判斷一個(gè)值x是不是NaN,應(yīng)使用x!=x。
isNaN是一個(gè)全局函數(shù)??梢杂脕?lái)判斷一個(gè)數(shù)字是不是NaN,如何一個(gè)是NaN或者不能轉(zhuǎn)換成一個(gè)數(shù)字,返回true.
1 console.log(isNaN([])); //false2 console.log(isNaN('3')) //fase3 console.log(isNaN('ab')) //true
isFinity()也是一個(gè)全局函數(shù)。當(dāng)參數(shù)是NaN(轉(zhuǎn)化成數(shù)字),-Infinity,Infinity的時(shí)候,返回false.其他時(shí)候都是返回true.
1 console.log(isFinite(Infinity)); //false2 console.log(isFinite(NaN)) //false3 console.log(isFinite('ab')) //false
四、字符串
字符串一個(gè)一組不可變字符組成的序列,字符串的字符索引從0開(kāi)始,字符串的長(zhǎng)度是其所包含的字符的個(gè)數(shù),空字符的長(zhǎng)度為0.
字符串直接量要用單引號(hào)或者雙引號(hào)括起來(lái),字符換換行用反斜線\連接。
‘’\'在字符串中有著特殊用途,'\'+字符會(huì)改變字符原來(lái)的意思。'\n'代表?yè)Q行,這類字符稱作轉(zhuǎn)義字符。
五、布爾值
布爾值指代真或假,只有兩個(gè)值true和false。JavaScript中比較運(yùn)算通常返回的都是布爾值。
a=1;b=2;
a==b;//返回false
六、null和undefined
null是JavaScript中的關(guān)鍵字。常用來(lái)表示空值。typeof null會(huì)返回"object".實(shí)際上null是它自有類型的唯一值。他表示數(shù)字、字符串、對(duì)象是無(wú)值的。
undefined是JavaScript中的全局變量,表示變量的值沒(méi)有初始化。typeof undefined返回"undefined"。是它自有類型的唯一成員。
1 console.log(typeof null); //object2 console.log(typeof undefined); //undefined
==運(yùn)算符認(rèn)為他兩個(gè)是相等。
七、全局對(duì)象
全局對(duì)象的屬性是全局定義的符號(hào),JavaScript可以直接使用。當(dāng)JavaScript解釋器啟動(dòng)時(shí),他會(huì)創(chuàng)建一個(gè)新的全局對(duì)象,并給他一組定義的初始屬性。
全局屬性:undefined、Infinity、NaN等
全局函數(shù):isNaN()、eval()等
構(gòu)造函數(shù):Date()、Array()等
全局對(duì)象:Math、JSON
全局對(duì)象的初始屬性不是保留字,但是應(yīng)該當(dāng)做保留字對(duì)待。
在最頂級(jí)代碼中,可以使用this關(guān)鍵字引用全局對(duì)象。全局對(duì)象定義了JavaScript中的所有的預(yù)定義全局值。這個(gè)特殊對(duì)象同時(shí)包含了程序定義的全局值(用戶自定義的全局變量)。
八、包裝對(duì)象
JavaScript中的數(shù)字、字符串、布爾值也可以調(diào)用方法。這些原始值在調(diào)用方法之前會(huì)通過(guò)對(duì)應(yīng)的構(gòu)造函數(shù)轉(zhuǎn)化成對(duì)象,調(diào)用對(duì)象的方法(屬性),對(duì)象會(huì)自動(dòng)銷毀。
1 var s="s";2 s.len=4;//給它設(shè)置屬性3 console.log(s.len);//undefined
null和undefined沒(méi)有包裝對(duì)象。訪問(wèn)它們的屬性會(huì)報(bào)錯(cuò)。
==認(rèn)為包裝對(duì)象是相等的,而===認(rèn)為他們是不等。
typeof可以看出其中的差別。
1 var s="s";2 var S=new String(s)3 console.log(typeof s);//"string"4 console.log(typeof S);//"object"
九、不可變的原始值和可變的對(duì)象引用
原始值是不可變的。通過(guò)字符串的方法修改字符串返回一個(gè)新的字符串,而字符串的原始值并沒(méi)改變。
1 var s="sdasd";2 console.log(s.toUpperCase());//"SDASD"
3 console.log(s);//"sdasd"
原始值得比較是值得比較。例如字符串只要長(zhǎng)度相等,對(duì)應(yīng)位置的字符相等,則認(rèn)為它們是相等。
對(duì)象和原始值不同,對(duì)象的值是可變的。
1 var obj={2 a:1,3 b:24 }5 obj.a=3;6 console.log(obj.a); //3
對(duì)象的比較不能通過(guò)值來(lái)比較,即使兩個(gè)對(duì)象同樣的值屬性且屬性值相等。它們也是不相等。
變量存儲(chǔ)的是對(duì)象的引用值,即對(duì)象在堆中的地址。只有引用值相等。才能認(rèn)為兩個(gè)對(duì)象是相等。
十、類型轉(zhuǎn)換
a.隱式類型轉(zhuǎn)化
JavaScript中的取值類型非常靈活,可以根據(jù)需要自動(dòng)轉(zhuǎn)化類型。
對(duì)象轉(zhuǎn)換成布爾值:所有的對(duì)象都會(huì)轉(zhuǎn)換成true;new Boolean(false)對(duì)象也會(huì)轉(zhuǎn)換成true.
對(duì)象轉(zhuǎn)換成數(shù)字和對(duì)象轉(zhuǎn)換成字符串:這里提到到轉(zhuǎn)換方法只適合于本地對(duì)象(宿主對(duì)象(Web瀏覽器定義的對(duì)象)有自己的轉(zhuǎn)換規(guī)則)。所有的對(duì)象都繼承了兩個(gè)轉(zhuǎn)化方法。
第一個(gè)是toString()方法:默認(rèn)的toString()方法用來(lái)返回對(duì)象的類型。
1 var obj={2 a:1,3 b:24 }5 console.log(obj.toString()); //[object object]
日期對(duì)象、數(shù)組、函數(shù)、正則對(duì)象的toString()方法。
1 console.log([1,2,3].toString()); //1,2,32 console.log(new Date().toString()) //Wed Mar 07 2018 02:01:18 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)3 console.log(function(){return 0;}.toString()) //function (){return 0;}4 console.log(/\d+/i.toString()) // /\d+/i
第二個(gè)方法時(shí)valueOf().如果對(duì)象存在原始值。則這個(gè)方法返回原始值,大多數(shù)對(duì)象無(wú)法還原成原始值,valueOf()簡(jiǎn)單返回對(duì)象本身。數(shù)組、函數(shù)、正則對(duì)象的valueOf()方法返回對(duì)象本身。而日期對(duì)象的valueOf()返回的是1970.1.1到現(xiàn)在的毫秒數(shù)。
1 console.log(new Date().valueOf()) //1520359837257
JavaScript中的對(duì)象轉(zhuǎn)換成字符串:--如果對(duì)象有toString()方法,調(diào)用這個(gè)方法返回一個(gè)原始值,再把原始值轉(zhuǎn)換成字符串。
--如果對(duì)象沒(méi)有toString()方法,或者這個(gè)方法返回的不是一個(gè)原始值,則調(diào)用valueOf(),調(diào)用這個(gè)方法返回一個(gè)原始值,再把原始值轉(zhuǎn)換成字符串。
--如果不能通過(guò)上述的兩個(gè)方獲得原始值,則拋出一個(gè)類型錯(cuò)誤。
JavaScript對(duì)象轉(zhuǎn)換成數(shù)字:和轉(zhuǎn)發(fā)成字符串的方法類似,不過(guò)先調(diào)用valueOf()方法獲得原始值,轉(zhuǎn)換成數(shù)字。
+、==、!=、關(guān)系運(yùn)算符(>、<)中對(duì)象到原始值的轉(zhuǎn)換:先調(diào)用valueOf(),在調(diào)用toString()。得到的原始值直接使用。
+、==操作日期對(duì)象時(shí)轉(zhuǎn)化成數(shù)字、字符串:先調(diào)用toString(),在調(diào)用valueOf(),得到原始值直接使用。
1 var now=new Date();2 console.log(now==now.toString());//true 先調(diào)用toString()3 console.log(now+1) //Wed Mar 07 2018 02:37:30 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)1 先調(diào)用toString()4 console.log(now>now-1) //true 先調(diào)用valueOf()
b、顯示類型轉(zhuǎn)換
轉(zhuǎn)換成數(shù)字:Number()函數(shù)、ParseInt()、ParseFloat()
Number()只能基于10進(jìn)制進(jìn)行轉(zhuǎn)換,不能出現(xiàn)非法的尾隨字符:
ParseInt()用于整型:可以忽略前導(dǎo)空格、盡可能多的解析更多數(shù)值,忽略后面的內(nèi)容,不能轉(zhuǎn)換返回NaN
ParseFloat()整型和浮點(diǎn)型 可以忽略前導(dǎo)空格、盡可能多的解析更多數(shù)值,忽略后面的內(nèi)容,不能轉(zhuǎn)換返回NaN
parseInt可以接受第二個(gè)參數(shù),這個(gè)參數(shù)指定數(shù)字的基數(shù)(2~36)。
轉(zhuǎn)換成字符串:String()、toString()
String()函數(shù)會(huì)把null、undefined轉(zhuǎn)換成空對(duì)象,而toString()方法會(huì)報(bào)錯(cuò)。
toString()在用于數(shù)字到字符串的轉(zhuǎn)換時(shí),可以在參數(shù)中輸入數(shù)的基數(shù),表示數(shù)字是幾進(jìn)制的。
1 var n=12;2 console.log(n.toString(16));//c
toFixed()、toExponential()、toPrecision()也可以用于數(shù)字到字符串的轉(zhuǎn)換;
toFixed(arg):參數(shù)用來(lái)指定小數(shù)的位數(shù)
toExponential(arg):使用指數(shù)計(jì)數(shù)法表示數(shù)字,小數(shù)點(diǎn)前只有一位,參數(shù)指定了小數(shù)點(diǎn)后的位數(shù)
toPrecision(arg):arg指定有效數(shù)字的位數(shù),如果有效數(shù)字的位數(shù)少于整數(shù)部分的位數(shù),則使用指數(shù)表示。
以上的三個(gè)方法會(huì)進(jìn)行四舍五入和補(bǔ)0操作。
1 var a=123456.7892 console.log(a.toFixed(0)) //"123457"3 console.log(a.toFixed(1)) //"123456.8"4 console.log(a.toFixed(5)) //"123456.78900"5 console.log(a.toExponential(2)) //"1.23E5"6 console.log(a.toExponential(3)) //"1.235E5"7 console.log(a.toPrecision(3)) //"1.23e5"8 console.log(a.toPrecision(7)) //"123456.8"
轉(zhuǎn)換成對(duì)象:Object()
轉(zhuǎn)換成布爾值:Boolean()
十一、變量聲明
a、用var關(guān)鍵字聲明變量:
var x,y; var x=1,y=2;
聲明的變量沒(méi)有初始化之前的值是undefined.
可以使用聲明一個(gè)變量多次,但是不能使用未聲明的變量。不使用var關(guān)鍵字聲明的變量是全局變量,無(wú)論位置。不用var聲明的變量可以用delete 刪除。
b、全局變量和局部變量
全局變量擁有全局作用,局部變量只在函數(shù)內(nèi)可見(jiàn),函數(shù)體局部變量的優(yōu)先級(jí)高于全局變量。
c、變量聲明提前
在函數(shù)中變量的聲明前就可以用,變量的聲明就好像放在函數(shù)的最前面一樣?!?/span>
1 (function(){2 console.log(a);//undefined3 var a=0;4 console.log(a);//05 })();
十二、作用域鏈
JavaScript中規(guī)定全局變量是全局對(duì)象的屬性,可以通過(guò)this關(guān)鍵字引用全局變量。而局部變量是與函數(shù)調(diào)用相關(guān)的某個(gè)對(duì)象的屬性,JavaScript中沒(méi)有辦法引用該對(duì)象。作用域鏈?zhǔn)且粋€(gè)鏈表,上面存放了當(dāng)前位置代碼可訪問(wèn)的變量的保存對(duì)象。JavaScript需要訪問(wèn)某個(gè)變量時(shí),它會(huì)在作用域鏈的對(duì)象上查找是否有該屬性,直到找到該屬性,否則會(huì)報(bào)錯(cuò)。
函數(shù)在定義的時(shí)候保存一個(gè)作用域鏈,當(dāng)函數(shù)調(diào)用的時(shí)候,創(chuàng)建一個(gè)對(duì)象用來(lái)保存函數(shù)內(nèi)部的局部變量,然后把對(duì)象添加到作用域鏈上,同時(shí)創(chuàng)建一個(gè)新的更長(zhǎng)的函數(shù)調(diào)用鏈。當(dāng)函數(shù)有嵌套函數(shù)時(shí),函數(shù)每次調(diào)用時(shí)內(nèi)部函數(shù)的作用域鏈都是不同的。
聯(lián)系客服