第三章 基本概念
本章基本內(nèi)容
- 語法
- 數(shù)據(jù)類型
- 流控制語句
- 理解函數(shù)
(一)語法
區(qū)分大小寫
在JS里面變量忧设,函數(shù)名和操作符都嚴(yán)格區(qū)分大小寫。這就意味著變量名test和Test分別表示兩個(gè)不同的變量源武。而函數(shù)名不能用typeof,因?yàn)樗且粋€(gè)關(guān)鍵字疗涉。標(biāo)識(shí)符
所謂標(biāo)識(shí)符就是指變量涨享,函數(shù),屬性的名字同云,或者函數(shù)的參數(shù)糖权。
標(biāo)識(shí)符的命名規(guī)則:
只能是字母或數(shù)字或下劃線或美元($)
開頭不能是數(shù)字,因?yàn)樗植磺迨菙?shù)字還是變量
按照慣例命名采用的是駝峰大小格式炸站,也就是第一個(gè)字母小寫星澳,剩下的每個(gè)有意義的單詞的首字母大寫
千萬不能把關(guān)鍵字,保留字旱易,true,false和null作為標(biāo)識(shí)符.-
注釋
// 單行注釋
/* 塊級(jí)注釋*/
-
嚴(yán)格模式
"use strict" 表示執(zhí)行的是嚴(yán)格模式
例如
function dosomething(){
"use strict"
//函數(shù)體
}
嚴(yán)格模式JS的執(zhí)行結(jié)果會(huì)有很大的不同禁偎,支持嚴(yán)格模式的瀏覽器包括 IE10+,FireFox4+ ,Safari5.1+ ,Opera 12+ 和Chrome 語句
在JS里面語句一般都是分號(hào)結(jié)尾,要是省略分號(hào)阀坏,則有解析氣確定語句的結(jié)尾如暖。(這種不推薦)關(guān)鍵字和保留字
1.在JS里面保留了一些關(guān)鍵字不能作為標(biāo)識(shí)符。期待后用忌堂,比如 break do else catch delete等等這些沒必要記憶盒至。寫的時(shí)候不用命名就可以
(二)變量
- 變量的定義要使用var操作符。(var 是一個(gè)關(guān)鍵字)后面跟變量名(標(biāo)識(shí)符)即可:
例如 var message ;
- 用window來定義
例如
window["a"] = 3;
window.alert(a);
例如
function test(){
var message ;
}
這行代碼定義了一個(gè)名為message的變量士修。該變量可以用來保存任何值(像這樣未經(jīng)過初始化的變量都會(huì)保存一個(gè)特殊的值--undefined)
因此定義變量的同時(shí)就可以設(shè)置變量的值枷遂。
例如:
var message = "hi";
所以變量message就保存了一個(gè)字符串"hi"像這樣的初始化變量并不會(huì)把他標(biāo)記為字符串類型,初始化的過程就是給變量賦一個(gè)值那么簡單棋嘲。
因此酒唉,可以在修改變量值得同事修改值得類型。如下
var message = "h1";
message = 100 ; 有效但是不推薦
在上面這個(gè)例子中變量MESSAGE一開始保存了一個(gè)字符串值"hi",然后該值又被一個(gè)數(shù)字值100縮代替沸移。雖然我們不建議修改變量的類型痪伦。但是這樣完全有效
特別注意的是即使使用var操作符定義的變量將成為定義該變量的作用域的局部變量侄榴。也就是說如果在函數(shù)中使用var定義一個(gè)變量,那個(gè)這個(gè)變量在函數(shù)退出后就會(huì)被銷毀
例如
function test(){
var message = "hi"; //局部變量
}
test();
window.alert(message); //錯(cuò)誤
這里變量message實(shí)在函數(shù)中用var來定義的。當(dāng)函數(shù)被調(diào)用就會(huì)創(chuàng)建該變量并為其賦值网沾。而在此之后牲蜀,變量又會(huì)被銷毀。所以例子中的下一行代碼就會(huì)導(dǎo)致錯(cuò)誤
也可以這樣做
function test(){
message = "hi"; //全局變量
}
test();
alert(message); //"hi"
這個(gè)例子省略了var操作符,因此message就成了全局變量绅这。這樣只要調(diào)用一次test()函數(shù),這個(gè)變量就變成全局變量在辆,任何地方都能訪問
(三)數(shù)據(jù)類型
typeof 操作符
- undefined--> 如果這個(gè)值未定義
- boolean -->如果這個(gè)值是布爾值
- string ----> 如果這個(gè)值是字符串
- number--> 如果這個(gè)值是數(shù)值
- object----> 如果這個(gè)值是對象或者null
- function--> 如果這個(gè)值是函數(shù)
var message = "some string";
alert(typeof(message)); //"string"
alert(typeof(message)); //"string"
alert(typeof 95); //"num"
這幾個(gè)例子說明typeof操作符的操作數(shù)可以是變量message证薇,也可以是數(shù)值字面量
typeof 是一個(gè)操作符而不是函數(shù)。盡管括號(hào)里面都能使用匆篓,但是不是必需的浑度。
-
Undefined 類型
他表示的意思就是聲明變量但是沒有對他加以初始化,這個(gè)變量值就是undefined
例如 var message ;
window.alert(message == undefined) //true
但是包含undifined值得變量和尚未定義的變量還是不一樣的鸦概÷嵴牛看下面:
var message ; //這個(gè)變量聲明后默認(rèn)取得了undefined值
window.alert(message); //undefined
window.alert(age); //產(chǎn)生錯(cuò)誤
但是你要使用
window.alert(typeof(message)); //undefined ;
window.alert(typeof(age)); //undefined;
結(jié)果則是一樣的。
-
Null類型
Null類型是第二個(gè)只有一個(gè)值得數(shù)據(jù)類型窗市。這個(gè)特殊值就是null,null值表示一個(gè)空對象指針先慷。而這正是使用typeof操作符檢測NULL值返回object的原因
var car = null ;
window.alert(typeof car); // "object"
如果定義的變量準(zhǔn)備保存對象,那最好變量初始化的時(shí)候?yàn)閚ull,而不是其他值咨察。這樣一來论熙,只要直接檢查null值就可以知道相應(yīng)的變量是否保存一個(gè)對象的引用.
if(car !=null)
{
//對car對象執(zhí)行了某些操作
}
實(shí)際上 undefined值派生自null值得.
特別注意alert(null = = undefined); //true
這里,位于null和undefined之間的相等操作符
盡管null和undefined 有這樣的關(guān)系,但是他們的用途完全不同。所以無論在什么情況下摄狱,都沒有必要把一個(gè)變量的值顯示的設(shè)置為undefined
可是同樣的規(guī)則對null卻不管用脓诡。
換句話說:只要保存的變量是對象類型,建議初始用null
-
Boolean類型(布爾類型)
該字面量只有2個(gè)字面量值: true和false
這兩個(gè)值與數(shù)字不是同一回事媒役,因此true不一定等于1,而false不一定等于0
var found = true ;
var lost = false;
Boolean的字面值 true和false也是區(qū)分大小寫的祝谚。也就是說True和False(以及其他的混合大小寫形式)都不是Boolean值 ,只是標(biāo)識(shí)符
雖然Boolean的字面值只有2個(gè)酣衷,但是所有類型的值都有與這2個(gè)布爾值等價(jià)的值交惯。要將一個(gè)值轉(zhuǎn)換成其他對應(yīng)的布爾值,可以調(diào)用函數(shù)Boolean()
var message = "Hello world";
var meaasge = Boolean(message);
在這個(gè)例子里面字符串message轉(zhuǎn)換成了一個(gè)Boolean值.該值被保存在messageAsBoolean變量中.可以對任何數(shù)據(jù)類型的值調(diào)用Boolean()函數(shù)鸥诽。并且總會(huì)返回一個(gè)布爾值.
-
Number
這種類型用來表示的整數(shù)和浮點(diǎn)數(shù)(浮點(diǎn)數(shù)也被稱之為雙精度數(shù)值)
最基本的數(shù)值是十進(jìn)制,十進(jìn)制整數(shù)可以直接輸入:
var intNum = 55; //整數(shù)
除了十進(jìn)制以外還可以通過八進(jìn)制(以8位基數(shù))或者十六進(jìn)制(以16為基數(shù))的字面值來表示.其中八進(jìn)制第一位必須是0商玫,然后八進(jìn)制數(shù)字序列(0~7)如果字面值中的數(shù)值超出了范圍,那么前面0將被忽略牡借,后面的數(shù)組將被當(dāng)做十進(jìn)制數(shù)值解析
var oct1 = 070 //八進(jìn)制的56
var oct2 = 079 //無效的八進(jìn)制數(shù)值解析為79
var oct3 = 08 ; //無效的八進(jìn)制數(shù)值 解析為8
(八進(jìn)制字面量在嚴(yán)格模式下是無效的拳昌,所以會(huì)導(dǎo)致JS引擎拋出錯(cuò)誤)
十六進(jìn)制字面值的前兩位必須是0x,后面跟任何十六進(jìn)制數(shù)字(09及AF)其中字母A~F可以大寫,也可以小寫钠龙。如下面的例子:
var hexnum1 = 0xA ; //十六進(jìn)制的10
var hexNum2 = 0x1f ; //十六進(jìn)制的31
在進(jìn)行算術(shù)計(jì)算時(shí)炬藤,所有以八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都會(huì)被轉(zhuǎn)成十進(jìn)制 -
浮點(diǎn)數(shù)值
所謂浮點(diǎn)數(shù)值御铃,就是該數(shù)值中必須包含的一個(gè)小數(shù)點(diǎn),必須小數(shù)點(diǎn)后面有一位數(shù)字。雖然小數(shù)點(diǎn)前面可以沒有整數(shù)沈矿,但是強(qiáng)力不推薦上真。
var floatNum = 1.1 ;
var floatNum = 0.1;
var floatNum =.1; //有效但不推薦
由于保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值得兩倍.因此當(dāng)小數(shù)點(diǎn)后面沒有跟任何數(shù)字的時(shí)候,這個(gè)數(shù)值可以作為整數(shù)值來保存羹膳。同樣的當(dāng)浮點(diǎn)數(shù)值本身就是一個(gè)整數(shù)(如1.0)那么該值也會(huì)被轉(zhuǎn)換成整數(shù)
var floatNum = 1.; //小數(shù)點(diǎn)后沒有數(shù)字解析為1
var floatNuM = 10.0 ; //整數(shù)--解析為10
對于那些極大或極小的數(shù)值睡互,可以用e表示法(即科學(xué)計(jì)數(shù)法)表示的浮點(diǎn)數(shù)值表示.用e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪。ECMA中 e表示法的格式也是如此
var floatNum = 3.125e7; //等于3.12510的7次方
var floatNum2 = 3e-17 //等于310的負(fù)17次冪
這里特別注意的就是浮點(diǎn)數(shù)精度最高是17位小數(shù)陵像,但是計(jì)算的時(shí)候遠(yuǎn)遠(yuǎn)不如整數(shù)就珠,例如0.1加0.2的結(jié)果不是0.3而是0.30000000000000004這個(gè)小小的舍入誤差會(huì)導(dǎo)致無法測試特定的浮點(diǎn)數(shù)值,19.31*100=1930.9999999999998,所以浮點(diǎn)數(shù)計(jì)算必須要確定位數(shù)。
if(a+b==0.3){
window.alert("結(jié)果是0.3");
}
他這輩子也彈不出來
-
數(shù)值范圍
在JS中保存的最小數(shù)值保存在Number.MIN_VALUE中--在大多數(shù)的瀏覽器中這個(gè)值是5e-324意思就是5*10的-324次冪能夠表示的最大數(shù)值保存在Number.MAX_VALUE中 這個(gè)值也就是1.797693e+308次冪
如果計(jì)算的結(jié)果超過了這個(gè)區(qū)間的值醒颖。那個(gè)這個(gè)數(shù)值會(huì)自動(dòng)轉(zhuǎn)換成Indinity值.如果是負(fù)數(shù)就是-Infinity(負(fù)無窮)如果這個(gè)數(shù)是正數(shù)妻怎,則會(huì)轉(zhuǎn)換成Infinity(正無窮)
如果某次計(jì)算返回了正或者負(fù)的Infinity值。那么該值將無法繼續(xù)參與下一次的計(jì)算.因?yàn)镮nfinity是不能夠參與計(jì)算的數(shù)值.要是想判斷一個(gè)數(shù)值是不是有窮的可以用isFinite()函數(shù)
如果有窮就返回的是true 要是無窮就是false
NaN
NaN即非數(shù)值(Not a Number)
在JS里面任何數(shù)值除以0都會(huì)返回NaN泞歉,因此不會(huì)影響代碼的執(zhí)行
NaN本身有2個(gè)非同尋常的特點(diǎn)
-
任何涉及NaN的操作(例如NaN/10)都會(huì)返回NaN
-
NaN與任何值都不相等逼侦,包括NaN本身
下面的代碼就會(huì)返回false
alert(NaN == NaN) //false
針對這個(gè)特點(diǎn)JS里面有定義了isNaN()函數(shù),這個(gè)函數(shù)接受一個(gè)參數(shù),用來判斷該參數(shù)是否不是數(shù)值.
要是數(shù)值則直接返回true 要不是數(shù)值則返回false
他執(zhí)行前會(huì)優(yōu)先執(zhí)行Number()這個(gè)方法這樣比如說"10"他會(huì)變成10這樣來判斷
alert(isNaN(NaN)) //true
alert(isNaN(10)) //false (10是一個(gè)整數(shù))
alert(isNaN("10")) //false (可以被轉(zhuǎn)換成數(shù)值10)
alert(isNaN("blue"))//true (不能被轉(zhuǎn)換成數(shù)值)
alert(isNaN(true)); //false(可以被轉(zhuǎn)換成數(shù)值1)
數(shù)值轉(zhuǎn)換
有3個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換成數(shù)值:Number(),parseInt(),parseFloat()
第一個(gè)函數(shù)腰耙,即Number()可以用于任何數(shù)據(jù)榛丢,而另外2個(gè)則專門用于把字符串變成數(shù)值.這3個(gè)函數(shù)對于同樣的輸入會(huì)返回不同的結(jié)果
Number()轉(zhuǎn)換規(guī)則如下:
- 如果是布爾類型,true和false將分別轉(zhuǎn)換為 1 和 0
- 如果是數(shù)字值 ,只是簡單地傳入和返回
- 如果是null值 ,返回0
- 如果是undefined ,返回NaN
- 如果是字符串遵循下面規(guī)律:
- 如果字符串中只包含數(shù)字(包括前面帶正號(hào)或者負(fù)號(hào)的情況挺庞,則轉(zhuǎn)換成十進(jìn)制數(shù)值)即"1"會(huì)變成1,"123"會(huì)變成123涕滋,而"011"會(huì)變成11(前面的0被忽略了)
- 如果字符串包含有效的浮點(diǎn)格式例如"1.1"則將其轉(zhuǎn)換為對應(yīng)的浮點(diǎn)數(shù)值(同時(shí)也會(huì)忽略前面的0)
- 如果字符串是空的(不包含任何字符),則會(huì)將其轉(zhuǎn)換為0
- 如果字符串中包含上述格式以外的字符,則將其轉(zhuǎn)換為NaN
- 具體見下面:
var num1 = Number("Hellow") // NaN
var num2 = Number("") // 0
var num3 = Number("00000011") //11
var num4 = Number(true) //1
由于Number()再轉(zhuǎn)換成字符串的時(shí)候不夠方便和快捷挠阁。所以衍生出parseInt()和parseFloat()
parseInt()在轉(zhuǎn)換的時(shí)候她會(huì)忽略字符串前面的空格宾肺,直到第一個(gè)非空格字符串。如果第一個(gè)字符不是數(shù)字字符或者負(fù)號(hào)parseInt()就會(huì)返回NaN
也就是說parseInt()轉(zhuǎn)換空字符串會(huì)返回NaN
如果第一個(gè)字符串是數(shù)字字符侵俗,parseInt()會(huì)繼續(xù)解析第二個(gè)字符,直到解析完所有后續(xù)字符或者遇到了一個(gè)非數(shù)字字符锨用。例如:"1234abcdef"會(huì)轉(zhuǎn)換成1234,因?yàn)?abcdef"會(huì)被完全忽略隘谣。類似的"22.5"會(huì)被轉(zhuǎn)化成22.因?yàn)樾?shù)點(diǎn)并不是有效的數(shù)字字符.他只能解析數(shù)字增拥,null,""什么的都是NaN
具體見下面:
var num1 = parseInt("1234abcd"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA"); //10(十六進(jìn)制)
var num4 = parseInt(22.5); //22
var num5 = parseInt("070"); //56(八進(jìn)制)
var num6 = parseInt("70"); //70(十進(jìn)制)
var num7 = parseInt("0xf"); //15(十六進(jìn)制)
這里特別注意的就是JS里面盡量少用8進(jìn)制數(shù)码泛,盡量少用8進(jìn)制數(shù)猾封,盡量少用8進(jìn)制數(shù),重要的話說3遍
為了消除困惑噪珊,他允許你能傳遞第二個(gè)參數(shù).
var num = parseInt("0xAF",16); //175
實(shí)際上如果制定了16作為第二個(gè)參數(shù)晌缘,字符串可以不帶前面的"0x"
var num1 = parseInt("AF",16); // 175
var num2 = parseInt("AF"); //NaN
var num3 = parseInt("10",10); //10
var num4 = parseInt("10",16); //16
String類型
String類型用于表示由0或多個(gè)16位Unicode字符字符組成的字符序列齐莲,及字符串。字符串可以由雙引號(hào)("")或者單引號(hào)('')表示磷箕,因此下面兩種字符串的寫法都是有效的
var fristName = "Nike";
var lastName = 'killer';
與PHP不同的是在JS里面雙引號(hào)和單引號(hào)沒有什么區(qū)別选酗。用雙信號(hào)表示的字符串和用單引號(hào)表示的字符串完全相同。不過用雙引號(hào)開頭的字符串也必須以雙引號(hào)結(jié)尾,而已單引號(hào)開頭的字符串必須以單引號(hào)結(jié)尾。
-
字符字面量
String數(shù)據(jù)類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義序列,用于表示非打印字符缚够,或者其他用途的字符。
例如
\n 表示換行
\r 表示回車
等等這些
這些字符字面量可以出現(xiàn)在字符串中的任意位置,而且也將被作為一個(gè)字符來解析,比如
var text = "This is:\u03a3.";
上面這個(gè)text中里面的字符數(shù)一共有9個(gè),6個(gè)字符長的轉(zhuǎn)義序列表示1個(gè)字符
任何字符串的長度都可以通過length屬性來取得椎工。例如:
alert(text.length); //輸出結(jié)果就是9
在JS里面字符串是不可改變的饭于。也就是說字符串一旦創(chuàng)建。他們的的值就不能改變了维蒙。要改變某個(gè)變量保存的字符串掰吕,首先要銷毀原來的字符串。然后再用一個(gè)包含新值得字符串進(jìn)行填充.
例如
var lang = "JavaScript";
lang +="Perfect";
lang 就變成JavascriptPerfect
-
轉(zhuǎn)換為字符串
要把一個(gè)值轉(zhuǎn)成一個(gè)字符串有2種方法颅痊,第一種就是使用幾乎每一個(gè)值都有的toString()方法
例如:
var gae = 11;
var ageString = age.toString();//字符串"11"
var found = true;
var foundString = found.toString(); // 字符串"true";
特別注意的是數(shù)值,布爾值,對象,字符串值都有這個(gè)方法.但是null和undefined沒有這個(gè)方法.
多數(shù)情況下調(diào)用toString()不必傳遞參數(shù)殖熟。但是調(diào)用toString()也可以傳遞參數(shù)
例如 var num = 10 ;
window.alert(num.toString(10)); //"10"
window.alert(num.toString(2)); // "1010"
window.alert(num.toString(8)); //"12"
window.alert(num.toString(16)); //"a";
特別注意的就是默認(rèn)的沒有參數(shù)的輸出值與指定基數(shù)10時(shí)相同
例如:
var value = 10;
var value2 = true;
var value3 = null;
var value4;
window.alert(String(value)); // "10"
window.alert(String(value2)); //"true"
window.alert(String(value3)); //"null"
window.alert(String(value4)); //"undefined"
Object類型
后續(xù)會(huì)講到