JavaScript語法
什么是腳本程序和JavaScript
?*什么是腳本程序
?<html>
?<script language="javascript">
??? alert(new Date());
?</script>
?</html>
?*JavaScript簡介
? 前身叫作Livescript,是一種基于對象(Object)和事件驅(qū)動(Event Driver),并具有安全性能的腳本語言.
?*JavaScript與Java
? 是兩個公司開發(fā)的兩個不同產(chǎn)品,作用與用途大不一樣,但兩者語法上有很多相似之處,JavaScript并不是
? Java的子集.
?*JavaScript,JScript與ECMAScript
?*腳本代碼的位置
? 我們可以把代碼放到<script></script>標(biāo)簽之間:
? <script>
??? var x=3;
? </script>
? <p>This is a HTML 段落</p>
? <script>
??? alert(x);
? </script>
? 也可以放在一個單獨的文件中:
? <html>
? <script src="script.js" language="javascript">
?*將腳本程序代碼作為屬性值
? <a href="javascript:alert(new Data());">javascript</a>
? </html>
=======================================================================================
JavaScript的基本語法
?*JavaScript中的標(biāo)識符
?標(biāo)識符是指JavaScript中定義的符號,例如,變量名,函數(shù)名,數(shù)組名等.標(biāo)識符可以由任意順序的
?大小寫字母,數(shù)字,下劃線(_)和美元符號($)組成,但標(biāo)識符不能以數(shù)字開頭,不能是JavaScript
?中的保留關(guān)鍵字.
?合法的標(biāo)識符舉例: indentifler,username,user_name,_username,$username
?非法的標(biāo)識符舉例: int,98.3,Hello World
?*Java嚴(yán)格區(qū)分大小寫
?computer和Computer是兩個完全不同的標(biāo)識符
?*JavaScript程序代碼格式
?每條功能語句的最后必須用分號(;)結(jié)束,每個詞之間用空格,制表符,換行符或大括號,小括號這樣
?的分隔符隔開.
?*JavaScript程序的注釋
?/*...*/中可以嵌套"http://"注釋,但不能嵌套"/"...."/".
================================================================================
基本數(shù)據(jù)類型與常量
?*正型常量
?十六進(jìn)制以O(shè)x或OX開頭,例如:Ox8a.八進(jìn)制必須以O(shè)開頭,例如: 0123.十進(jìn)制的第一位不能為0
?(數(shù)字0除外),例如: 123
?*字符常量
?12.32,123.42,5E7,4e5等.
?*布爾值
?true和false.
?*字符串常量
?例如: "a book of JavaScript",'abc',"a",""(空字符串) .
?特殊字符需要用反斜杠(\)來轉(zhuǎn)意.
?例如: \r, \n, \t, \b, \', \\
?在JavaScript中一個連續(xù)的字符串不能分開在兩行中來寫.可以使用"+"號連起來.
?*null常量
?表示變量的值為空
?*undefined常量
?表示一個變量還沒有被復(fù)值時的狀態(tài),或某個對象的屬性不存在.
=========================================================================================
變量
?*定義一個變量,系統(tǒng)就會為之分配一塊內(nèi)存,程序可以用變量名來表示這塊內(nèi)存中的數(shù)據(jù).
?*聲明變量用var關(guān)鍵字
?例如: var x; (這個時候就是undifeined)
?*聲明變量的同時為其賦值
?例如: var name="lisi";
?*對已賦值的變量賦于一個其他類型的數(shù)據(jù)
?例如: name=123;
?*不事先聲明變量而直接使用
?例如: x=1234;
算術(shù)運算符
?*+ 加法運算符或正值運算符,例如, x+5, +6.
? 它還能實現(xiàn)多個字符串的想加,也能將字符串與其他的數(shù)據(jù)類型連成一個新的字符串,條件
? 條件是該表達(dá)式中至少有一個字符串,例如: "x"+123的結(jié)果為"x123".
?*- 減法運算符或負(fù)預(yù)算符,例如, 7-3, -8.
?** 乘法運算符,例如, 3*7.
?*/ 除法運算符,例如 9/4.
?*% 求模運算符(算術(shù)中的求余),例如, 5%2
?*++將變量值加1后再將結(jié)果賦給這個變量,分為兩種,例如a++和++a
?*--用法與++預(yù)算符一樣
?
賦值運算符
?
? 賦值運算符的作用是將一個值賦給一個變量,最常用的是"=",還可以由"="運算符和其他的一些
? 預(yù)算符組合成新的運算符,例如:
? "+=","-="等.
比較運算符
? *>大于
?? 當(dāng)左邊的操作數(shù)大于右邊的操作數(shù)時,返回true.
? *<小與
? *=
? *<=
? *>=
? *==
? *!=
? 注意: 不要把"=="寫成"="
邏輯運算符
?
? *&&
? 邏輯與,當(dāng)左右兩邊的操作數(shù)都為true時,返回值為true,否則為false.
? *||
? 邏輯或,當(dāng)左右兩邊的操作數(shù)都為false時,返回值為false,否則為true.
? *!
? 邏輯非,當(dāng)操作數(shù)為ture的時,返回值為false,否則為true.
========================================================================
程序流程控制
?
?*順序結(jié)構(gòu)
?*if條件選擇語句
?*switch選擇語句
?*while循環(huán)語句
?*do while語句
?*for循環(huán)語句
?*break與continue語句
?if條件語句語法1:
?if(條件語句)
?{
?? 執(zhí)行語句塊
?}
?注意:if(x==null)或if(typeof(x)=="undefined")可以簡寫成if(!x)
?if條件語句語法2:
?if(條件語句)
?{
?? 執(zhí)行語句塊1
?}
?else
?{
?? 執(zhí)行語句塊2
?}
?變量=布爾表達(dá)式? 語句1 :語句2
?if條件語句語法3:
?if(條件語句)
?{
?? 執(zhí)行語句塊1
?}
?else if(條件語句2)
?{
?? 執(zhí)行語句塊2
?}
?....
?else if(條件語句塊n)
?{
?? 執(zhí)行語句塊n
?}
?else
?{
?? 執(zhí)行語句塊n+1
?}
?if語句塊的嵌套
?if(x<1)
?{
? if(y==1)
??? alert("x<1,y==1");
? else
??? alert("x<1,y!=1");
? }
? else if(x>10)
? {
??? if(y==1)
????? alert("x>10,y==1);
??? else
????? alert("x>10,y!=1");??
? }
===================================================================
函數(shù)
?
?*函數(shù)的作用與定義
?*全局變量與局部變量
?*參數(shù)個數(shù)可變的函數(shù)
?*創(chuàng)建動態(tài)函數(shù)
?*JavaScript中的系統(tǒng)函數(shù)
? 定義一個函數(shù)的語法如下:
? function 函數(shù)名 (參數(shù)列表)
? {
???? 程序代碼
???? return 表達(dá)式;
? }
? 對函數(shù)調(diào)用的幾種方式:
? 1.函數(shù)名(傳遞函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,.....)
? 2.變量=函數(shù)名(傳遞函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,.....)
? 3.對于有返回值的函數(shù)調(diào)用,也可以在程序中直接使用返回結(jié)果,例如:
? alert("sum="+square(2,3));
? 全局變量與局部變量,看下面的代碼:
? <script language="javascript">
?? var msg="全局變量";
?? function show()
?? {
????? msg="局部變量";
?? }
?? show();
?? alert(msg);
? </script>
? 參數(shù)個數(shù)可變的的函數(shù):
?<script language="javascript">
? function testparams()
? {
??? var params="";
??? for(var i=0;i<arguments.length;i++)
??? {
????? params +=" "+ arguments[i];
??? }
??? alert(params);
? }
??? testparams("abc",123);
??? testparams(123,456,"abc");
?</script>
? 注意:arguments代表了傳遞給函數(shù)的所有參數(shù)的所有集合。當(dāng)函數(shù)的個數(shù)不確定,
? 獲得參數(shù)個數(shù)很多,你又不想為每個參數(shù)定義一個變量,那么你就可以定義一個
? 像上面那個一樣的,定義一個為空的參數(shù)名,在內(nèi)部用循環(huán)來實現(xiàn)。
?創(chuàng)建動態(tài)函數(shù)的語法:
?var varName=new Function(argument1,....,lastArgument);
?說明:
?所有的參數(shù)都必須是字符串型的,最后的參數(shù)必須是這個動態(tài)函數(shù)的功能程序代碼.
?例子:
?<script>
?? var square=new Function("x","y",
??????????? "var sum;sum=x*x+y*y; return sum;");
?? alert(square(3,2));
?</script>
?動態(tài)函數(shù)有什么作用,在什么情況下使用?
?
?JavaScript中的系統(tǒng)函數(shù):
?.encodeURI方法(比URL的描述的范圍更大,一般情況下可以等同)
?返回一個URI字符串編碼后的效果。例如:
?<script language="javascript">
?? var uriStr=encodeURI("http://www.doit.org/index.html?country=中國&name=z x");
?? alert(uriStr);
?</script>
?.decodeURI方法
?將一個已編碼的URI字符串解碼成最初的字符串并返回.
?.parseInt方法
? 第一字符串按指定的進(jìn)制轉(zhuǎn)換成一個整數(shù),語法格式為:parseInt(numString,[redix])。
? 如果沒有指定第二個參數(shù),則前綴為'Ox'的字符串被視為十六進(jìn)制,前綴為'O'的字符串
? 被視為八進(jìn)制,所有其他的字符串被視為十進(jìn)制。
? 例如: alert(parseInt("123abc",10));
?.parseFloat方法
? 將一個字符串轉(zhuǎn)換為小數(shù)。
?.isNaN方法(用與檢測)
?.escape方法(用于對文本的簡單加密)
? 返回對一個字符串進(jìn)行編碼后的結(jié)果字符串。所有空格,標(biāo)點,重音符號以及任何其他
? ASCII字符都用%xx編碼替換,其中xx等于表示該字符的Unicode編碼的十六進(jìn)制數(shù),字符
? 值大于255字符以%uxxxx格式表示。
?.unescape方法
? 將一個用escape方法編碼的字符串解碼成原始字符串。
?.eval方法
? 將其中的參數(shù)字符串作為一個JavaScript表達(dá)式執(zhí)行。
=======================================================================
? 對象
?*對象與對象實例
?*構(gòu)造方法與this關(guān)鍵字的作用
?*在函數(shù)中修改參數(shù)值的問題
?對象與對象實例
?.對象中所包含的變量就是對象的屬性,對象中所包含的對屬性進(jìn)行操作的函數(shù)就是對象的
? 方法,對象的屬性和方法都叫對象的成員。
?.對象是某一類事物的描述,是抽象的概念;而對象實例是一類事物中的具體個例。
?.能夠被用來創(chuàng)建對象實例的函數(shù)就是對象的構(gòu)造函數(shù),只要定義一個對象的構(gòu)造函數(shù),就
? 等于被定義了一個對象。使用new關(guān)鍵字和對象的構(gòu)造函數(shù)就可以創(chuàng)建對象實例,語法格式
? 如下: var ObjectInstance = new ObjName(傳遞給該對象的實際參數(shù)列表)。
? <script language="javascript">
? function Person()
? {
??? //這是一個構(gòu)造函數(shù)
? }
? var person1 = new Person();? //創(chuàng)建了一個實例變量(對象實例)
? person1.age = 18;
? person1.name = "blovesaga"; //age和name為對象屬性
? //alert(person1.name+"."+person1.age);
? function sayFunc()
? {
??? alert(person1.name+"."+person1.age);//我們也可以使用person["age"](對象實例["成員變量"])來訪問
? }
? person1.say=sayFunc;? //把方法名賦值給了person1.say成員,我們可以在其他地方像
??????????????????????? //調(diào)用方法一樣來調(diào)用
? person1.say();
? </script>
看下面的例子:
<html>
?<script language="javascript">
?? //定義一個構(gòu)造函數(shù),也就是對象的名稱為person
?? function Person()
?? {
?? }
?? //創(chuàng)建一個對象實例
?? var person1=new Person();
?? person1.age=18;
?? person1.name="zxy";
?? //編寫一個成員方法
?? function sayFunc()
?? {
????? var x="name";
????? eval("alert(person1."+ x + ");");? //這個字符串中的內(nèi)容將被作為JavaScipt代碼來執(zhí)行
????? alert(person1.name+":"+person1.age);
?? }
?? person1.say=sayFunc; //把方法名賦值給了person1.say成員
?? person1.say=sayFunc(); //寫了括號表示執(zhí)行sayFunc()函數(shù)在復(fù)值
?? person1.say();
?</script>
</html>
===================================================================
構(gòu)造方法與this關(guān)鍵字
?.為一個對象實例新增加的屬性和方法,不會增加到同一個對象所產(chǎn)生的其它對象實例上。
?.所有的實例對象在創(chuàng)建都會自動調(diào)用構(gòu)造函數(shù),在構(gòu)造函數(shù)中增加的屬性和方法會被
? 增加到每個對象實例上。
?.對象實例是使用new關(guān)鍵字創(chuàng)建的,在構(gòu)造方法中不要有返回結(jié)果的return語句。
?.調(diào)用對象的成員方法時,需要使用“對象實例.成員方法"的形式,很顯然,用作成
? 員方法的函數(shù)被調(diào)用,一定伴隨有某個對象實例。this關(guān)鍵字代表某個成員方法執(zhí)行時
?? ,引用該方法的當(dāng)前對象實例,所以,this關(guān)鍵字一般只在用作對象成員方法的
? 函數(shù)中出現(xiàn)。
? <script language="javascript">
?? function Person(name,age)
?? {
???? this.age=age;
???? this.name=name;
???? this.say=sayFunc;
?? }
?? function sayFunc()
?? {
????? alert(this.name+":"+this.age);
?? }
?? var person1=new Person("張山",18);
?? person1.say();
?? var person2 = new Person("里四",30);
?? person2.say();
? </script>
例子代碼:
<html>
?<script language="javascript">
?? //定義一個構(gòu)造函數(shù)
?? function Person(name,age)
?? {
???? this.name=name;//當(dāng)前的對象實例增加一個成員變量name,成員變量的通過Person()參數(shù)name傳遞進(jìn)來
???? this.age=age;//當(dāng)前的對象實例增加一個成員變量age,成員變量的通過Person()參數(shù)age傳遞進(jìn)來
???? this.say=sayFunc; //增加一個sayFunc()函數(shù)
?? }
?? function sayFunc()
?? {
???? alert(this.name + ":" + this.age);
?? }
?? //創(chuàng)建一個對象實例
?? var person1=new Person("張三",18);
?? person1.say();? //調(diào)用person1的say()成員方法
?? var person2=new Person("李四",29);
?? person2.say();? //調(diào)用person2的say()成員方法
?</script>
</html>
=====================================================================
在函數(shù)中修改參數(shù)值的問題
?將基本數(shù)據(jù)類型的變量作為函數(shù)參數(shù)傳遞的情況:
?<script language="javascript">
? function changeValue(x)
? {
??? x=5;
? }
? var x=3;
? changeValue(x);
? alert(x);
?</script>
注意: 在函數(shù)changeValue(x)中的x=5并不能修改主程序中的x值,函數(shù)接受的參數(shù)
就相當(dāng)于一個局部變量,當(dāng)函數(shù)調(diào)用完也就沒用了。所以該程序的結(jié)果為x=3;如果
我們把一個對象的實例傳遞給函數(shù),而我們有在函數(shù)中修改了對象實例的屬性,那么
最后的結(jié)果也會變化的。