第三章 基本概念
本章基本內(nèi)容
- 語法
- 數(shù)據(jù)類型
- 流控制語句
- 理解函數(shù)
(一)語法
區(qū)分大小寫
在JS里面變量,函數(shù)名和操作符都嚴格區(qū)分大小寫。這就意味著變量名test和Test分別表示兩個不同的變量。而函數(shù)名不能用typeof,因為它是一個關(guān)鍵字。標(biāo)識符
所謂標(biāo)識符就是指變量,函數(shù),屬性的名字,或者函數(shù)的參數(shù)。
標(biāo)識符的命名規(guī)則:
只能是字母或數(shù)字或下劃線或美元($)
開頭不能是數(shù)字,因為他分不清是數(shù)字還是變量
按照慣例命名采用的是駝峰大小格式,也就是第一個字母小寫,剩下的每個有意義的單詞的首字母大寫
千萬不能把關(guān)鍵字,保留字,true,false和null作為標(biāo)識符.-
注釋
// 單行注釋
/* 塊級注釋*/
-
嚴格模式
"use strict" 表示執(zhí)行的是嚴格模式
例如
function dosomething(){
"use strict"
//函數(shù)體
}
嚴格模式JS的執(zhí)行結(jié)果會有很大的不同,支持嚴格模式的瀏覽器包括 IE10+,FireFox4+ ,Safari5.1+ ,Opera 12+ 和Chrome 語句
在JS里面語句一般都是分號結(jié)尾,要是省略分號,則有解析氣確定語句的結(jié)尾。(這種不推薦)關(guān)鍵字和保留字
1.在JS里面保留了一些關(guān)鍵字不能作為標(biāo)識符。期待后用,比如 break do else catch delete等等這些沒必要記憶。寫的時候不用命名就可以
(二)變量
- 變量的定義要使用var操作符。(var 是一個關(guān)鍵字)后面跟變量名(標(biāo)識符)即可:
例如 var message ;
- 用window來定義
例如
window["a"] = 3;
window.alert(a);
例如
function test(){
var message ;
}
這行代碼定義了一個名為message的變量。該變量可以用來保存任何值(像這樣未經(jīng)過初始化的變量都會保存一個特殊的值--undefined)
因此定義變量的同時就可以設(shè)置變量的值。
例如:
var message = "hi";
所以變量message就保存了一個字符串"hi"像這樣的初始化變量并不會把他標(biāo)記為字符串類型,初始化的過程就是給變量賦一個值那么簡單。
因此,可以在修改變量值得同事修改值得類型。如下
var message = "h1";
message = 100 ; 有效但是不推薦
在上面這個例子中變量MESSAGE一開始保存了一個字符串值"hi",然后該值又被一個數(shù)字值100縮代替。雖然我們不建議修改變量的類型。但是這樣完全有效
特別注意的是即使使用var操作符定義的變量將成為定義該變量的作用域的局部變量。也就是說如果在函數(shù)中使用var定義一個變量,那個這個變量在函數(shù)退出后就會被銷毀
例如
function test(){
var message = "hi"; //局部變量
}
test();
window.alert(message); //錯誤
這里變量message實在函數(shù)中用var來定義的。當(dāng)函數(shù)被調(diào)用就會創(chuàng)建該變量并為其賦值。而在此之后,變量又會被銷毀。所以例子中的下一行代碼就會導(dǎo)致錯誤
也可以這樣做
function test(){
message = "hi"; //全局變量
}
test();
alert(message); //"hi"
這個例子省略了var操作符,因此message就成了全局變量。這樣只要調(diào)用一次test()函數(shù),這個變量就變成全局變量,任何地方都能訪問
(三)數(shù)據(jù)類型
typeof 操作符
- undefined--> 如果這個值未定義
- boolean -->如果這個值是布爾值
- string ----> 如果這個值是字符串
- number--> 如果這個值是數(shù)值
- object----> 如果這個值是對象或者null
- function--> 如果這個值是函數(shù)
var message = "some string";
alert(typeof(message)); //"string"
alert(typeof(message)); //"string"
alert(typeof 95); //"num"
這幾個例子說明typeof操作符的操作數(shù)可以是變量message,也可以是數(shù)值字面量
typeof 是一個操作符而不是函數(shù)。盡管括號里面都能使用,但是不是必需的。
-
Undefined 類型
他表示的意思就是聲明變量但是沒有對他加以初始化,這個變量值就是undefined
例如 var message ;
window.alert(message == undefined) //true
但是包含undifined值得變量和尚未定義的變量還是不一樣的??聪旅?
var message ; //這個變量聲明后默認取得了undefined值
window.alert(message); //undefined
window.alert(age); //產(chǎn)生錯誤
但是你要使用
window.alert(typeof(message)); //undefined ;
window.alert(typeof(age)); //undefined;
結(jié)果則是一樣的。
-
Null類型
Null類型是第二個只有一個值得數(shù)據(jù)類型。這個特殊值就是null,null值表示一個空對象指針。而這正是使用typeof操作符檢測NULL值返回object的原因
var car = null ;
window.alert(typeof car); // "object"
如果定義的變量準備保存對象,那最好變量初始化的時候為null,而不是其他值。這樣一來,只要直接檢查null值就可以知道相應(yīng)的變量是否保存一個對象的引用.
if(car !=null)
{
//對car對象執(zhí)行了某些操作
}
實際上 undefined值派生自null值得.
特別注意alert(null = = undefined); //true
這里,位于null和undefined之間的相等操作符
盡管null和undefined 有這樣的關(guān)系,但是他們的用途完全不同。所以無論在什么情況下,都沒有必要把一個變量的值顯示的設(shè)置為undefined
可是同樣的規(guī)則對null卻不管用。
換句話說:只要保存的變量是對象類型,建議初始用null
-
Boolean類型(布爾類型)
該字面量只有2個字面量值: true和false
這兩個值與數(shù)字不是同一回事,因此true不一定等于1,而false不一定等于0
var found = true ;
var lost = false;
Boolean的字面值 true和false也是區(qū)分大小寫的。也就是說True和False(以及其他的混合大小寫形式)都不是Boolean值 ,只是標(biāo)識符
雖然Boolean的字面值只有2個,但是所有類型的值都有與這2個布爾值等價的值。要將一個值轉(zhuǎn)換成其他對應(yīng)的布爾值,可以調(diào)用函數(shù)Boolean()
var message = "Hello world";
var meaasge = Boolean(message);
在這個例子里面字符串message轉(zhuǎn)換成了一個Boolean值.該值被保存在messageAsBoolean變量中.可以對任何數(shù)據(jù)類型的值調(diào)用Boolean()函數(shù)。并且總會返回一個布爾值.
-
Number
這種類型用來表示的整數(shù)和浮點數(shù)(浮點數(shù)也被稱之為雙精度數(shù)值)
最基本的數(shù)值是十進制,十進制整數(shù)可以直接輸入:
var intNum = 55; //整數(shù)
除了十進制以外還可以通過八進制(以8位基數(shù))或者十六進制(以16為基數(shù))的字面值來表示.其中八進制第一位必須是0,然后八進制數(shù)字序列(0~7)如果字面值中的數(shù)值超出了范圍,那么前面0將被忽略,后面的數(shù)組將被當(dāng)做十進制數(shù)值解析
var oct1 = 070 //八進制的56
var oct2 = 079 //無效的八進制數(shù)值解析為79
var oct3 = 08 ; //無效的八進制數(shù)值 解析為8
(八進制字面量在嚴格模式下是無效的,所以會導(dǎo)致JS引擎拋出錯誤)
十六進制字面值的前兩位必須是0x,后面跟任何十六進制數(shù)字(09及AF)其中字母A~F可以大寫,也可以小寫。如下面的例子:
var hexnum1 = 0xA ; //十六進制的10
var hexNum2 = 0x1f ; //十六進制的31
在進行算術(shù)計算時,所有以八進制和十六進制表示的數(shù)值最終都會被轉(zhuǎn)成十進制 -
浮點數(shù)值
所謂浮點數(shù)值,就是該數(shù)值中必須包含的一個小數(shù)點,必須小數(shù)點后面有一位數(shù)字。雖然小數(shù)點前面可以沒有整數(shù),但是強力不推薦。
var floatNum = 1.1 ;
var floatNum = 0.1;
var floatNum =.1; //有效但不推薦
由于保存浮點數(shù)值需要的內(nèi)存空間是保存整數(shù)值得兩倍.因此當(dāng)小數(shù)點后面沒有跟任何數(shù)字的時候,這個數(shù)值可以作為整數(shù)值來保存。同樣的當(dāng)浮點數(shù)值本身就是一個整數(shù)(如1.0)那么該值也會被轉(zhuǎn)換成整數(shù)
var floatNum = 1.; //小數(shù)點后沒有數(shù)字解析為1
var floatNuM = 10.0 ; //整數(shù)--解析為10
對于那些極大或極小的數(shù)值,可以用e表示法(即科學(xué)計數(shù)法)表示的浮點數(shù)值表示.用e表示法表示的數(shù)值等于e前面的數(shù)值乘以10的指數(shù)次冪。ECMA中 e表示法的格式也是如此
var floatNum = 3.125e7; //等于3.12510的7次方
var floatNum2 = 3e-17 //等于310的負17次冪
這里特別注意的就是浮點數(shù)精度最高是17位小數(shù),但是計算的時候遠遠不如整數(shù),例如0.1加0.2的結(jié)果不是0.3而是0.30000000000000004這個小小的舍入誤差會導(dǎo)致無法測試特定的浮點數(shù)值,19.31*100=1930.9999999999998,所以浮點數(shù)計算必須要確定位數(shù)。
if(a+b==0.3){
window.alert("結(jié)果是0.3");
}
他這輩子也彈不出來
-
數(shù)值范圍
在JS中保存的最小數(shù)值保存在Number.MIN_VALUE中--在大多數(shù)的瀏覽器中這個值是5e-324意思就是5*10的-324次冪能夠表示的最大數(shù)值保存在Number.MAX_VALUE中 這個值也就是1.797693e+308次冪
如果計算的結(jié)果超過了這個區(qū)間的值。那個這個數(shù)值會自動轉(zhuǎn)換成Indinity值.如果是負數(shù)就是-Infinity(負無窮)如果這個數(shù)是正數(shù),則會轉(zhuǎn)換成Infinity(正無窮)
如果某次計算返回了正或者負的Infinity值。那么該值將無法繼續(xù)參與下一次的計算.因為Infinity是不能夠參與計算的數(shù)值.要是想判斷一個數(shù)值是不是有窮的可以用isFinite()函數(shù)
如果有窮就返回的是true 要是無窮就是false
NaN
NaN即非數(shù)值(Not a Number)
在JS里面任何數(shù)值除以0都會返回NaN,因此不會影響代碼的執(zhí)行
NaN本身有2個非同尋常的特點
-
任何涉及NaN的操作(例如NaN/10)都會返回NaN
-
NaN與任何值都不相等,包括NaN本身
下面的代碼就會返回false
alert(NaN == NaN) //false
針對這個特點JS里面有定義了isNaN()函數(shù),這個函數(shù)接受一個參數(shù),用來判斷該參數(shù)是否不是數(shù)值.
要是數(shù)值則直接返回true 要不是數(shù)值則返回false
他執(zhí)行前會優(yōu)先執(zhí)行Number()這個方法這樣比如說"10"他會變成10這樣來判斷
alert(isNaN(NaN)) //true
alert(isNaN(10)) //false (10是一個整數(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個函數(shù)可以把非數(shù)值轉(zhuǎn)換成數(shù)值:Number(),parseInt(),parseFloat()
第一個函數(shù),即Number()可以用于任何數(shù)據(jù),而另外2個則專門用于把字符串變成數(shù)值.這3個函數(shù)對于同樣的輸入會返回不同的結(jié)果
Number()轉(zhuǎn)換規(guī)則如下:
- 如果是布爾類型,true和false將分別轉(zhuǎn)換為 1 和 0
- 如果是數(shù)字值 ,只是簡單地傳入和返回
- 如果是null值 ,返回0
- 如果是undefined ,返回NaN
- 如果是字符串遵循下面規(guī)律:
- 如果字符串中只包含數(shù)字(包括前面帶正號或者負號的情況,則轉(zhuǎn)換成十進制數(shù)值)即"1"會變成1,"123"會變成123,而"011"會變成11(前面的0被忽略了)
- 如果字符串包含有效的浮點格式例如"1.1"則將其轉(zhuǎn)換為對應(yīng)的浮點數(shù)值(同時也會忽略前面的0)
- 如果字符串是空的(不包含任何字符),則會將其轉(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)換成字符串的時候不夠方便和快捷。所以衍生出parseInt()和parseFloat()
parseInt()在轉(zhuǎn)換的時候她會忽略字符串前面的空格,直到第一個非空格字符串。如果第一個字符不是數(shù)字字符或者負號parseInt()就會返回NaN
也就是說parseInt()轉(zhuǎn)換空字符串會返回NaN
如果第一個字符串是數(shù)字字符,parseInt()會繼續(xù)解析第二個字符,直到解析完所有后續(xù)字符或者遇到了一個非數(shù)字字符。例如:"1234abcdef"會轉(zhuǎn)換成1234,因為"abcdef"會被完全忽略。類似的"22.5"會被轉(zhuǎn)化成22.因為小數(shù)點并不是有效的數(shù)字字符.他只能解析數(shù)字,null,""什么的都是NaN
具體見下面:
var num1 = parseInt("1234abcd"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA"); //10(十六進制)
var num4 = parseInt(22.5); //22
var num5 = parseInt("070"); //56(八進制)
var num6 = parseInt("70"); //70(十進制)
var num7 = parseInt("0xf"); //15(十六進制)
這里特別注意的就是JS里面盡量少用8進制數(shù),盡量少用8進制數(shù),盡量少用8進制數(shù),重要的話說3遍
為了消除困惑,他允許你能傳遞第二個參數(shù).
var num = parseInt("0xAF",16); //175
實際上如果制定了16作為第二個參數(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或多個16位Unicode字符字符組成的字符序列,及字符串。字符串可以由雙引號("")或者單引號('')表示,因此下面兩種字符串的寫法都是有效的
var fristName = "Nike";
var lastName = 'killer';
與PHP不同的是在JS里面雙引號和單引號沒有什么區(qū)別。用雙信號表示的字符串和用單引號表示的字符串完全相同。不過用雙引號開頭的字符串也必須以雙引號結(jié)尾,而已單引號開頭的字符串必須以單引號結(jié)尾。
-
字符字面量
String數(shù)據(jù)類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義序列,用于表示非打印字符,或者其他用途的字符。
例如
\n 表示換行
\r 表示回車
等等這些
這些字符字面量可以出現(xiàn)在字符串中的任意位置,而且也將被作為一個字符來解析,比如
var text = "This is:\u03a3.";
上面這個text中里面的字符數(shù)一共有9個,6個字符長的轉(zhuǎn)義序列表示1個字符
任何字符串的長度都可以通過length屬性來取得。例如:
alert(text.length); //輸出結(jié)果就是9
在JS里面字符串是不可改變的。也就是說字符串一旦創(chuàng)建。他們的的值就不能改變了。要改變某個變量保存的字符串,首先要銷毀原來的字符串。然后再用一個包含新值得字符串進行填充.
例如
var lang = "JavaScript";
lang +="Perfect";
lang 就變成JavascriptPerfect
-
轉(zhuǎn)換為字符串
要把一個值轉(zhuǎn)成一個字符串有2種方法,第一種就是使用幾乎每一個值都有的toString()方法
例如:
var gae = 11;
var ageString = age.toString();//字符串"11"
var found = true;
var foundString = found.toString(); // 字符串"true";
特別注意的是數(shù)值,布爾值,對象,字符串值都有這個方法.但是null和undefined沒有這個方法.
多數(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";
特別注意的就是默認的沒有參數(shù)的輸出值與指定基數(shù)10時相同
例如:
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ù)會講到