語法
(1)到現在為止,大多數瀏覽器也還是支持到ECMAScript 第三版的標準。 核心概念就是一個語言的基本工作原理,涉及語法,操作符,數據類型。
(2)javascript的一切--變量,函數名,操作符都區分大小寫。
按照慣例,標識符采用駝峰大小寫習慣
?
firstSecond
myCar
doSomethingImportant
?
變量
(1)ECMAScript變量是松散類型的,可以保存任何類型的數據,而且它不像C#的 var 類型,初始化之后類型,隨著變量值的修改,類型也會修改。
var message = “hi”; //這里一開始保存了一個字符串類型,值是hi。
message = 100;? //現在保存了一個整數類型,值是100.
?
(2)使用var操作符定義的變量將成為該變量的作用域中的局部變量,如果在函數中使用var定義一個變量,那么這個變量在函數退出后將會被銷毀
function test()
{
var message = "hi"; //局部變量
}
test();
alert(message); //undefined 變量message在函數中使用var定義,當函數被調用時,就會創建該變量并為其賦值,出了函數作用范圍,變量立即被銷魂, 因此下一行代碼會導致錯誤。
?
//下面的例子省略了var操作符,從而創建一個全局變量。
function test(){
message = "hi"; //全局變量
}
test();
alert(message); //“hi” 這里省略了var操作符,因而message就成了全局變量,只要調用過一次test()函數,這個變量就有了定義, 就可以在函數外部的任何地方被訪問到。 但是這樣的做法不推薦,在局部作用域定義的全局變量很難維護。
?
數據類型
ECMAScript有5種簡單數據類型(或基本數據類型): Undefined, Null, Boolean, Number, String 還有一種復雜數據類型Object,Object本質上市由一組無序的名值對組成。 (為什么不將Null類型和Object類型歸為一類?這樣概念會清晰一點吧?)
typeof操作符 負責檢測給定變量的數據類型,對一個值使用typeof操作符肯呢過返回下列某個字符串:
“undefined” --如果這個值沒有定義。
“boolean”--如果這個值是布爾值
“string”--如果這個值是字符串
“number”--如果這個值是數值
“object”--如果這個值是對象或null
“function”--如果這個值是函數
?
Undefined類型
var message; //Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個量的值就是undefined,
alert(message == undefined); //true
?
?
var message = undefined; //使用undefined值顯式初始化了變量message, ECMA-262 第三版才引入這個值,為了正式區分空對象指針和未經初始化的變量
alter(message == undefined);//true
?
要注意包含undefined值的變量和尚未定義的變量還是不一樣的,看下面例子:
var message; //這個變量聲明之后默認取得了undefined值
?
//下面這個變量沒有聲明
// var age
?
alert(message); //"undefined"
alert(age); //產生錯誤
?
對于沒有聲明過的變量,只能執行一項操作,即使用typeof操作符檢測其數據類型。
但是令人困惑的是, 對未初始化的變量和未聲明的變量執行typeof操作符都同樣返回undefined值。 看下面的例子
var message; //這個變量聲明之后默認取得了undefined值
?
//下面這個變量并沒有聲明
// var age
?
alert(typeof message); //"undefined"
alert(typeof age ); //"undefined"
?
即使未初始化的變量會自動被賦予undefined值,但是顯示地初始化變量依然是明智的選擇, 如果這樣,那么當typeof操作符返回undefined值的時候,我們就知道被檢測的變量還沒有被聲明, 而不是尚未被初始化。
?
Null類型
Null類型是第二個只有一個值的數據類型,這個特殊的值是null。從邏輯角度來看, null值表示一個空對象指針,而這也正是使用typeof操作符檢測null值會返回"object”的原因
var car = null;
alert(typeof car); // "object"
如果定義的變量準備將來用于保存對象,那么最好將該變量初始化為null,而不是其他值,這樣,只要直接檢查null值就可以知道相應的變量是否已經保存了一個對象的引用。
?
Boolean類型
Boolean類型只有兩個字面值:true 和 false。 這兩個值與數字值不是一回事,因此true不一定等于1, false不一定等于0.? 雖然Boolean類型的字面值只有兩個,但是ECMAScript中所有類型的值都有與這兩個Boolean值等價的值。 要將一個值轉換為其對應的Boolean值, 可以調用轉型函數Boolean(), 如下例所示:
var message = “Hello world!”;
var messageAsBoolean = Boolean(message);
下面給出各種數據類型及其對應的轉換規則。 理解這些規則對理解流控制語句(if)自動執行相應的Boolean轉換非常重要。
數據類型 | 轉換為true的值 | 轉換為false的值 |
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零數字值(包括無窮大) | 0和NaN |
Object | 任何對象 | null |
Undefined | n/a | undefined |
?
Number類型
ECMAScript中最令人關注的數據類型, 不用記什么IEEE754格式,這些標準真多,下面只是以舉例子的形式理解
?
十進制整數可以像下面這樣直接在代碼中輸入: var intNum = 55;? // 整數 八進制整數的第一位 必須是零(0),然后是八進制數字序列(0-7)。如果字面值中的數值超出范圍,那么前導零將被忽略, 后面的數值被當做十進制數值解析。 var octalNum1 = 070;? //八進制的56 var octalNum2 = 079;? //無效的八進制數值--解析為79 var octalNum3 = 08;?? //無效的八進制數值--解析為8 十六進制字面值的前兩位必須是0x, 后跟任何十六進制數字(0-9 及A-F), 其中,A-F可以大寫,也可以小寫。 如下例所示: var hexNum1 = 0xA;?? //十六進制的10 var hexNum2 = ox1f?? //十六進制的31 進行運算時,八進制和十六進制表示的數值最終都將轉換成十進制數值。 |
?
浮點值,必須包含一個小數點,而且小數點后面必須至少有一位數字。 var floatNum1= 1.1; var floatNum2 = 0.1; var floatNum3 = .1? //有效,但不推薦 var floatNum4 = 1.; //小數點后面沒有數字----解析為1 var floatNum5 = 10.0;? //整數----解析為10 對于極大極小的數值,可以用e表示法表示的浮點表示 var floatNum = 3.125e7 //等于31250000 浮點數值的最高精度是17位小數,但是進行算術運算的時候其精度遠不如整數, 如0.1+0.2 結果不是0.3而是0.3000000000000004. |
?
NaN 即(Not a Number)是一個特殊的數值, 這個數值用于表示一個本來要返回數值的操作數未返回數值的情況。 NaN的特點,首先涉及NaN的操作都會返回NaN, 例如NaN/10, 其次NaN與任何值都不相等,包括NaN本身。 |
?
數值轉換
有三個函數可以把非數值轉換成為數值: Number(), parseInt()? 和parseFloat()。
Number()可以用于任何數據類型,而另外兩個則用于把字符串轉換成數值
Number()函數的轉換規則如下.
- 如果是Boolean值, true和false將分別轉換為1和0;
- 如果是數字值,只是簡單的傳入和返回
- 如果是null,? 返回0;
- 如果是unefined, 換回NaN;
- 如果是字符串, 遵循下列規則:
- 如果字符串中只包含數字,則將其轉換為十進制數值, 即“1”會變為1, “123”會變為123,”011”會變為11(前導零被忽略);
- 如果字符串中包含有效的浮點格式,如“1.1”, 則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
- 如果字符串中包含有效的十六進制格式,例如“0xf”,則將其轉換為相同大小的十進制整數值;
- 如果字符串是空的(不包含任何字符),則將其轉換為0;
- 如果字符串中包含除上述格式之外的字符,則將其轉換為NaN。
- 如果是對象,則調用對象的valueOf()方法, 然后依照前面的規則轉換返回的值,如果轉換的結果是NaN, 則調用對象的toString()方法,然后再次依照前面的規則轉換返回的字符串值。
parseInt()函數的轉換規則
他會忽略字符串前面的空格,知道找到一個非空格字符,如果第一個字符不是數字字符或者負號, parseInt()就會返回NaN, 也就是說, 用parseInt轉換空字符會返回NaN,(相對于Number()對空字符返回0)。 如果字符串以“0x”開頭且跟數字字符,就會將其當做一個十六進制整數,如果字符串以“0”開頭且后跟數字字符, 則會將其當做一個八進制數來解析。
下面是例子:
var num1 = parseInt(“1234blue”);? //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(十六進制數)
如果要知道解析的值是十六進制格式的字符串,那么指定基數16作為第二個參數,可以保證得到正確的結果,例如:
var num = parseInt(“0xAF”, 16);??? //175
如果指定了16作為第二個參數,字符串可以不帶前面的“0x“,如下所示:
var num1 = parseInt(“AF”, 16);??? //175? 第二個參數16明確告訴parseInt()要解析一個十六進制格式的字符串。
var num2 = parseInt(“AF”);???????? //NaN
而指定基數會影響到轉換的輸出結果。 例如
var num1 = parseInt(“10”, 2);?? //2 (按二進制解析)
var num2 = parseInt(“10”, 8);?? //8 (按八進制解析)
var num3 = parseInt(“10”,10);?? //10 (按十進制解析)
var num4 = parseInt(“10”,16);?? //16 (按十六進制解析)
ParseFloat()也是從第一個字符(位置0)開始解析每個字符。而且也是一直解析奧字符串末尾, 或者解析到遇見一個無效的浮點數字符為止。 字符串中的第一個小數點事有效的,第二個小數點是無效的,它后面的字符串將被忽略。 “22.34.5”將會被轉換為22.34.
第二點是parseFloat始終會忽略前導零, parseFloat只解析十進制值,因此沒有第二個指定參數作為基數的用法。
var num1 = parseFloat(“1234blue”);? //1234 (整數)
var num2 = parseFloat(“0xA”);? //0 十六進制數始終會轉換為零
var num3 = parseFloat(“22.5”);? //22.5
var num4 = parseFloat(“22.34.5”); //22.34
var num5 = parseFloat(“0908.5”);? //908.5
var num6 = parseFloat(“3.125e7”); //31250000
?
String類型
string類型用于表示由0個或多個16位Unicode字符組成的字符序列,即字符串。 字符串可以由雙引號(“)或單引號(‘)表示,
var firstName = “Nicholas”;
var lastName = ‘Zakas’;
以上兩種寫法完全相同,
要把一個值轉換為一個字符串有兩種方式,第一種使用幾乎每個值都有的toString()方法,這個方法要做的就是返回相應值得字符串表現。
var age = 11;
var ageAsString? = age.toString(); //字符串”11”
var found = true;
var foundAsString = found.toString();? //字符串”true”
數值,布爾值,對象,和字符串值(每個字符串也都有一個toString()方法, 該方法返回字符串的一個副本)都有一個toString方法,null 和undefined值沒有這個方法。
在不知道要轉換的值是不是null或undefined的情況下,可以使用轉型函數String(),將任何類型的值轉換為字符串,String()函數遵循下列規則:
- 如果值有toString()方法,則調用該方法(沒有參數)并返回相應的結果;
- 如值是null, 則返回“null”;
- 如果值是undefined,則返回“undefined”。
下面看幾個列子;
var value1 = 10;
var value2 = true;
var value3 = null;
var value4 ;
alert(String(value1)) ; //”10”
alert(String(value2)); //”true”
alert(String(value3)); //”null”
alert(String(value4")); //”undefined”
?
Object類型
ECMAScript中的對象就是一組數據和功能的集合。 對象可以通過執行new操作符后跟要創建的對像類型名稱來創建。 而創建Object類型的實例并為其添加屬性和(或)方法,就可以創建自定義對象。 如下:
var o = new Object();
僅僅創建Object的實例并沒有什么用處, 關鍵是要理解一個重要的思想:即在ECMAScript中,Object類型是它所有實例的基礎。 也就是說,Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中。
Object每個實例都具有下列屬性和方法:
- constructor--保存著用于創建當前對象的函數。 對于前面的例子而言構造函數就是Object();
- hasOwnProperty(propertyName)--用于檢查給定的屬性在當前對象實例中是否存在。 其中,作為參數的屬性名(propertyName)必須以字符串形式指定。(例如: o.hasOwnProperty(“name”))
- isPrototypeOf(object) --用于檢查傳入的對象是否是另一個對象的原型
- propertyIsEnumerable(propertyName) --用于檢查給定的屬性是否能夠使用for-in語句(本章后面將會討論)來枚舉。 與hasOwnProperty()方法一樣,作為參數名的屬性名必須以字符串形式指定。
- toString()--返回對象的字符串表示;
- valueOf()--返回對象的字符串, 數值或布爾值表示。 通常與toString()方法的返回值相同。
?
Javascript類型的內容到此為止