BloveSaga

          在希臘帕爾納斯山南坡上,有一個馳名世界的戴爾波伊神托所,在它的入口處的巨石上赫然銹刻著這樣幾個大字: 認識你自己!

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            34 隨筆 :: 12 文章 :: 122 評論 :: 0 Trackbacks

          #

          ???????? 多線程學習

          ?* 程序,進程和線程
          程序: 是指計算機指令的集合,它以文件的形式存儲在磁盤上。
          進程: 是一個程序在其自身的地址空間中的一次執行活動。

          進程是資源的申請,調度和獨立運行的單位,因此,它使用系統中的運行資源;而程序不能申請
          系統資源,不能被系統調度,也不能作為獨立運行的單位,因此,它不站用系統的運行資源。

          線程: 是進程中一個單一的連接控制流程。一個進程可以有多個線程。

          線程又稱為輕量級進程,它和進程一樣擁有獨立的執行控制,由操作系統負責調度,區別在于線程
          沒有獨立的存儲空間,而是和所屬進程中的其它線程共享一個存儲空間,這使得線程間的通信遠
          較進程簡單。
          ?* Java對多線程的支持
          Java在語言級提供了對多線程程序設計的支持。
          實現線程程序的兩種方式:
          (1)從Thread類繼承;
          (2)實現Runnable接口。

          Java運行時系統實現了一個用于調度線程執行的線程調度器,用于確定某一時刻由哪一個線程在
          CPU上運行。
          在java技術中,線程通常是搶占式的而不需要時間片分配進程(分配給每個線程相等的CPU時間的
          進程)。搶占式調度模型就是許多線程處于可以運行狀態(等待狀態),但實際上只有一個線程在
          運行。該線程一直運行到它終止進入可運行狀態(等待狀態),或者另一個具有更高優級的線程
          變成可運行狀態。在后一種情況下,低優先級的線程被高優先級的線程搶占,高優先級的線程獲得
          運行的機會。
          Java線程調度器支持不同優先級線程的搶占方式,但其本身不支持相同優先級線程的時間片輪換。
          Java運行時系統所在的操作系統(例如:windows2000)支持時間片的輪換,則線程調度器就支持
          相同優先級線程的時間片輪換。

          用多線程技術模擬一個售票系統
          實現代碼如下:
          class TicketSystem
          {
          ?public static void main(String[] args)
          ?{
          ??SellTicket st = new SellTicket();
          ??new Thread(st).start();
          ??new Thread(st).start();
          ??new Thread(st).start();
          ??new Thread(st).start();
          ?}
          }
          class SellTicket implements Runnable
          {
          ?int tickets=100;
          ?Object o = new Object();
          ?public void run()
          ?{
          ??while(true)
          ??{
          ???/*
          ??? synchronized(o)? //同步塊在關鍵字后得加個對象(任意的對象都可以)
          ??? {
          ???? ?if(tickets>0)
          ??? ?{
          ?????? try
          ????? {
          ???? ??? Thread.sleep(10);
          ????? }
          ????? catch(Exception e)
          ????? {
          ??????? e.printStackTrace();
          ????? }
          ????????? System.out.println(Thread.currentThread().getName()+
          ????????? "sell tickets"+tickets);
          ????????? tickets--;????
          ???? }
          ??? }
          ??? */
          ??? sell();?
          ??}
          ?}
          ?public synchronized void sell()? //同步方法
          ?{
          ???? ?if(tickets>0)
          ??? ?{
          ?????? try
          ????? {
          ???? ??? Thread.sleep(10);
          ????? }
          ????? catch(Exception e)
          ????? {
          ??????? e.printStackTrace();
          ????? }
          ????????? System.out.println(Thread.currentThread().getName()+
          ????????? "sell tickets"+tickets);
          ????????? tickets--;????
          ???? } ??
          ?}
          }
          ?* 線程的同步
          ?The code segments within a program that access the same object from separate,concurrent
          ?thread are called "critical sections"。
          ?同步的兩種方式:同步塊和同步方法
          ?沒一個對象都有一個監視器(monitor),或者叫做瑣。
          ?同步方法利用的是this所代表的對象的瑣。
          ?每個class也有一個瑣,是這個class所對應的Class對象的瑣。
          完整示例:
          class TicketSystem
          {
          ?public static void main(String[] args)
          ?{
          ??SellTicket st = new SellTicket();
          ??new Thread(st).start();
          ??/*
          ?? *寫一個try{}catch{}塊讓main()方法所在的線程睡1秒
          ?? *主要是想要線程優先啟動
          ??*/
          ??try
          ??{
          ???Thread.sleep(1);
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ??st.b=true;
          ??new Thread(st).start();
          ??//new Thread(st).start();
          ??//new Thread(st).start();
          ?}
          }
          class SellTicket implements Runnable
          {
          ?int tickets=100;
          ?Object obj = new Object();
          ?boolean b=false;
          ?public void run()
          ?{
          ??if(b==false)
          ??{
          ???while(true)
          ????? sell();
          ??}
          ??else
          ??{
          ?????while(true)
          ?? {??
          ??? synchronized(this)? //同步塊在關鍵字后得加個對象(任意的對象都可以)
          ??? {
          ???? ?if(tickets>0)
          ??? ?{
          ?????? try
          ????? {
          ???? ??? Thread.sleep(10);
          ????? }
          ????? catch(Exception e)
          ????? {
          ??????? e.printStackTrace();
          ????? }
          ????????? System.out.println("obj:"+Thread.currentThread().getName()+
          ????????? " sell tickets"+tickets);
          ????????? tickets--;????
          ???? }
          ??? }???
          ?? // sell();?
          ??}
          ??}

          ?}
          ?public synchronized void sell()? //同步方法
          ?{
          ???? ?if(tickets>0)
          ??? ?{
          ?????? try
          ????? {
          ???? ??? Thread.sleep(10);
          ????? }
          ????? catch(Exception e)
          ????? {
          ??????? e.printStackTrace();
          ????? }
          ????????? System.out.println("sell():"+Thread.currentThread().getName()+
          ????????? "sell tickets"+tickets);
          ????????? tickets--;????
          ???? } ??
          ?}
          }

          ?* 線程的死瑣
          ?哲學家進餐的問題
          ?一幫哲學家在一起進餐,但是每個人都只有1支筷子,大家都在等待別人拿出一支筷子讓自己
          ?先吃,然后再把自己的拿出去,但是大家都不愿意拿出自己的筷子。
          ?線程1瑣住了對象A的監視器,等待對象B的監視器,線程2鎖住了對象B的監視器,等待對象A的
          ?監視器,就造成了死瑣。

          ?示例代碼:
          class TicketSystem
          {
          ?public static void main(String[] args)
          ?{
          ??SellTicket st = new SellTicket();
          ??new Thread(st).start();
          ??/*
          ?? *寫一個try{}catch{}塊讓main()方法所在的線程睡1秒
          ?? *主要是想要線程優先啟動
          ??*/
          ??try
          ??{
          ???Thread.sleep(1);
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ??st.b=true;
          ??new Thread(st).start();
          ??//new Thread(st).start();
          ??//new Thread(st).start();
          ?}
          }
          class SellTicket implements Runnable
          {
          ?int tickets=100;
          ?Object obj = new Object();
          ?boolean b=false;
          ?public void run()
          ?{
          ??if(b==false)
          ??{
          ???while(true)
          ????? sell();
          ??}
          ??else
          ??{
          ?????while(true)
          ?? {??
          ??? synchronized(obj)? //同步塊在關鍵字后得加個對象(任意的對象都可以)
          ??? {
          ?????? try
          ????? {
          ???? ??? Thread.sleep(10);
          ????? }
          ????? catch(Exception e)
          ????? {
          ??????? e.printStackTrace();
          ????? }?
          ????? synchronized(this)
          ????? { ??? ?
          ???? ?????? if(tickets>0)
          ??? ???????? {
          ??????????????? System.out.println("obj:"+Thread.currentThread().getName()+
          ??????????????? " sell tickets"+tickets);
          ??????????????? tickets--;????
          ????????????? }
          ????? }
          ????? }???
          ??? }
          ??}

          ?}
          ?public synchronized void sell()? //同步方法
          ?{
          ??synchronized(obj)
          ??{
          ???? ?if(tickets>0)
          ??? ?{
          ?????? try
          ????? {
          ???? ??? Thread.sleep(10);
          ????? }
          ????? catch(Exception e)
          ????? {
          ??????? e.printStackTrace();
          ????? }
          ????????? System.out.println("sell():"+Thread.currentThread().getName()+
          ????????? "sell tickets"+tickets);
          ????????? tickets--;????
          ???? }
          ??}?
          ?}
          }
          ?* wait,notify,notifyAll
          ?每個對象除了有一個瑣之外,還有一個等待隊列(wait set),當一個對象剛剛創建的時候,它
          ?的等待隊列是空的。
          ?我們應該在當前線程鎖住對象的瑣后,去調用該對象的wait方法。
          ?當調用對象的notify方法時,將從該對象的等待隊列中刪除一個任意的線程,這個線程將再次
          ?成為可運行的線程。
          ?當調用對象的notifyAll方法時,將從該對象的等待隊列中刪除所有等待的線程,這些線程將
          ?成為可運行的線程。
          ?wait和notify重要用于producer-consumer這種關系中。
          ?代碼示例:
          ?class Test
          {
          ?public static void main(String[] args)
          ?{
          ??Queque q = new Queque();
          ??Procedur p = new Procedur(q);
          ??Consumer c = new Consumer(q);
          ??p.start();
          ??c.start();
          ??
          ?}
          }

          class Procedur extends Thread?? //生產者
          {
          ?Queque q;
          ?Procedur(Queque q)
          ?{
          ??this.q=q;
          ?}
          ?public void run()
          ?{
          ??for(int i=0;i<10;i++)
          ??{
          ???q.put(i);
          ???System.out.println("Procedur put"+ i);
          ??}
          ?}
          }

          class Consumer extends Thread?? //消費者
          {
          ?Queque q;
          ?Consumer(Queque q)
          ?{
          ??this.q=q;
          ?}
          ?public void run()
          ?{
          ??while(true)
          ??{
          ???System.out.println("Consumer get"+q.get());
          ??}
          ?}
          }

          class Queque??? //放置數據
          {
          ?int value;
          ?boolean bFull=false;
          ?public synchronized void put(int i)
          ?{
          ??if(!bFull)
          ??{
          ??? value=i;?
          ??? bFull=true;
          ??? notify();??
          ??}
          ??try
          ??{
          ???wait();
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ?}
          ?public synchronized int get()
          ?{
          ??if(!bFull)
          ??{
          ???try
          ???{
          ????wait();
          ???}
          ???catch(Exception e)
          ???{
          ????e.printStackTrace();
          ???}
          ??}
          ??bFull=false;
          ??notify();
          ??return value;
          ?}
          }


          ?線程的狀態圖

          ?? |
          ?? | new Thread
          ?? |?????????????????? yield????? sleep,wait,suspend,I/O阻塞
          ? \|/ start???????????????????? |------------------------------------>|
          ? New----->Runnable|??????????????????????????????????????????????????????? |Not Runnable
          ??????????????????????????? \??? |<------------------------------------|??????? ?/
          ???????????????????????????? \???? sleep結束,notify,resume,I/O操作完成??? /
          ????????????????????????????? \??????????????????????????????????????????????????????????????? ?/
          ?????????????????????????????? \???????????????????????????????????????????????????????????? ?/
          ??????????????????????????????? \??????????????????????????????????????????????????????? ?? /
          ???????????????????????????????? \?????????????????????????????????????????????????????? ? /
          ????????????????????????????????? \ run方法退出?????????????????????????????? ?/
          ?????????????????????????????????? \stop方法調用??????????????????????????? ?/
          ??????????????????????????????????? \?????????????????????????????????????????????? ?/
          ???????????????????????????????????? \?????????????????????????????????????????? ? /?
          ????????????????????????????????????? \??????????????????????????????????????? ? /? stop方法調用
          ?????????????????????????????????????? \????????????????????????????????????? ?/
          ??????????????????????????????????????? \???????????????????????????????????? /
          ???????????????????????????????????????? \?????????????????????????????????? /
          ????????????????????????????????????????? \?????????????????????????????? ?/
          ?????????????????????????????????????????? \????????????????????????? ?? /
          ??????????????????????????????????????????? \????????????????????????? ?/
          ???????????????????????????????????????????? \ ______?_____/
          ????????????????????????????????????????????? |??? ? Dead?????? ??|
          ????????????????????????????????????????????? |____________|
          ?線程的終止
          ?
          ?設置一個flag變量。
          ?結合interrupt()方法。
          ?code:
          class TestThread
          {
          ?public static void main(String[] args)
          ?{
          ??Thread1 t1=new Thread1();
          ??t1.start();
          ??int index=0;
          ??while(true)
          ??{
          ???if(index++==500)
          ???{
          ????t1.stopThread();
          ????break;
          ???}
          ???System.out.println(Thread.currentThread().getName());
          ??}
          ?}
          }

          class Thread1 extends Thread
          {
          ?private boolean bStop=false;
          ?public void run()
          ?{
          ??while(!bStop)
          ??{
          ???System.out.println(getName());
          ??}
          ?}
          ?public void stopThread()
          ?{
          ??bStop=true;
          ?}
          }

          posted @ 2006-06-08 12:21 藍色Saga 閱讀(172) | 評論 (0)編輯 收藏

          我這里有些視頻教程,需要的流下email,我會把具體的地址,我下載文件email給你!

          視頻目錄:

          1.HTTP協議詳解
          ????詳細介紹了 HTTP 協議的內容,包括: HTTP URL 、 HTTP 請求、 HTTP 響應和 HTTP 消息。
          ????最后給出了兩個實驗,幫助大家更好地理解 HTTP 協議。
          ??? 本課程將為您深入學習 Java Web 開發打下基礎。
          2.?Eclipse開發工具介紹
          ?????Eclipse是一個開放源代碼的、基于 Java 的可擴展的開發平臺,是目前非常流行的Java開發工具。
          ??? 本課程將為您介紹Eclipse的安裝、配置和使用。
          3. HTML語言速成
          ??? 幫助您快速掌握HTML語言,為學習XML和JSP開發打下基礎。
          4.? MySQL視頻教程
          5.? 面向對象程序設計
          6.? LINUX視屏教程

          如果以上有你需要的,就留下email地址,晚上我會統一發!
          posted @ 2006-06-07 15:30 藍色Saga 閱讀(1579) | 評論 (110)編輯 收藏

          匹配中文字符的正則表達式: ?[\u4e00-\u9fa5]

          匹配雙字節字符 ( 包括漢字在內 ) [^\x00-\xff]

          應用:計算字符串的長度(一個雙字節字符長度計 2 ASCII 字符計 1

          String.prototype.len=function(){return?this.replace([^\x00-\xff]/g,"aa").length;}

          匹配空行的正則表達式: \n[\s|?]*\r

          匹配 HTML 標記的正則表達式: /<(.*)>.*<\/\1>|<(.*)?\/>/?

          匹配首尾空格的正則表達式: (^\s*)|(\s*$)

          應用: javascript 中沒有像 vbscript 那樣的 trim 函數,我們就可以利用這個表達式來實現,如下:

          String.prototype.trim?=?function()
          {
          return?this.replace(/(^\s*)|(\s*$)/g,?"");
          }

          利用正則表達式分解和轉換 IP 地址:

          下面是利用正則表達式匹配 IP 地址,并將 IP 地址轉換成對應數值的 Javascript 程序:

          function?IP2V(ip)
          {
          re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g?//
          匹配 IP 地址的正則表達式
          if(re.test(ip))
          {
          return?RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
          }
          else
          {
          throw?new?Error("Not?a?valid?IP?address!")
          }
          }

          不過上面的程序如果不用正則表達式,而直接用 split 函數來分解可能更簡單,程序如下:

          var?ip="10.100.20.168"
          ip=ip.split(".")
          alert("IP
          值是: "+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

          匹配 Email 地址的正則表達式: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

          匹配網址 URL 的正則表達式: http://( [\w-]+\.)+[\w-]+(/[\w-?./?%&=]*)?

          利用正則表達式去除字串中重復的字符的算法程序: [ 注:此程序不正確,原因見本貼回復 ]

          var?s="abacabefgeeii"
          var?s1=s.replace(/(.).*\1/g,"$1")
          var?re=new?RegExp("["+s1+"]","g")
          var?s2=s.replace(re,"")?
          alert(s1+s2)?//
          結果為: abcefgi

          這個方法對于字符順序有要求的字符串可能不適用。

          得用正則表達式從 URL 地址中提取文件名的 javascript 程序,如下結果為 page1

          s="http://www.9499.net/page1.htm"
          s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
          alert(s)

          利用正則表達式限制網頁表單里的文本框輸入內容:

          用正則表達式限制只能輸入中文: onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')"?onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

          用正則表達式限制只能輸入全角字符: ?onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')"?onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

          用正則表達式限制只能輸入數字: onkeyup="value=value.replace(/[^\d]/g,'')?"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

          用正則表達式限制只能輸入數字和英文: onkeyup="value=value.replace(/[\W]/g,'')?"onbeforepaste="clipboardData.setData

          幾個常用正則表達式:
          ('text',clipboardData.getData('text').replace(/[^\d]/g,''))"?
          Email?:?/^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/,????
          Phone?:?/^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,????
          Mobile?:?/^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,????
          Url?:?/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,????
          IdCard?:?/^\d{15}(\d{2}[A-Za-z0-9])?$/,????
          Currency?:?/^\d+(\.\d+)?$/,
          Number?:?/^\d+$/,????
          Zip?:?/^[1-9]\d{5}$/,????
          QQ?:?/^[1-9]\d{4,8}$/,????
          Integer?:?/^[-\+]?\d+$/,????
          Double?:?/^[-\+]?\d+(\.\d+)?$/,????
          English?:?/^[A-Za-z]+$/,????
          Chinese?:??/^[\u0391-\uFFE5]+$/,????
          UnSafe?:/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,

          posted @ 2006-06-05 22:40 藍色Saga 閱讀(255) | 評論 (0)編輯 收藏

               摘要: 正則表達式是一個描述字符模式的對象。 JavaScript 的 RegExp 對象和 String 對象定義了使用正則表達式來執行強大的模式匹配和文本檢索與替換函數的方法 .'***********************'??????????????\\JavaScript//''***************...  閱讀全文
          posted @ 2006-06-05 22:37 藍色Saga 閱讀(729) | 評論 (0)編輯 收藏

          JavaScript語法

          什么是腳本程序和JavaScript

          ?*什么是腳本程序
          ?<html>
          ?<script language="javascript">
          ??? alert(new Date());
          ?</script>
          ?</html>

          ?*JavaScript簡介
          ? 前身叫作Livescript,是一種基于對象(Object)和事件驅動(Event Driver),并具有安全性能的腳本語言.
          ?*JavaScript與Java
          ? 是兩個公司開發的兩個不同產品,作用與用途大不一樣,但兩者語法上有很多相似之處,JavaScript并不是
          ? Java的子集.
          ?*JavaScript,JScript與ECMAScript
          ?*腳本代碼的位置
          ? 我們可以把代碼放到<script></script>標簽之間:
          ? <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中的標識符
          ?標識符是指JavaScript中定義的符號,例如,變量名,函數名,數組名等.標識符可以由任意順序的
          ?大小寫字母,數字,下劃線(_)和美元符號($)組成,但標識符不能以數字開頭,不能是JavaScript
          ?中的保留關鍵字.
          ?合法的標識符舉例: indentifler,username,user_name,_username,$username
          ?非法的標識符舉例: int,98.3,Hello World
          ?*Java嚴格區分大小寫
          ?computer和Computer是兩個完全不同的標識符
          ?*JavaScript程序代碼格式
          ?每條功能語句的最后必須用分號(;)結束,每個詞之間用空格,制表符,換行符或大括號,小括號這樣
          ?的分隔符隔開.
          ?*JavaScript程序的注釋
          ?/*...*/中可以嵌套"http://"注釋,但不能嵌套"/"...."/".

          ================================================================================
          基本數據類型與常量

          ?*正型常量
          ?十六進制以Ox或OX開頭,例如:Ox8a.八進制必須以O開頭,例如: 0123.十進制的第一位不能為0
          ?(數字0除外),例如: 123
          ?*字符常量
          ?12.32,123.42,5E7,4e5等.
          ?*布爾值
          ?true和false.
          ?*字符串常量
          ?例如: "a book of JavaScript",'abc',"a",""(空字符串) .
          ?特殊字符需要用反斜杠(\)來轉意.
          ?例如: \r, \n, \t, \b, \', \\
          ?在JavaScript中一個連續的字符串不能分開在兩行中來寫.可以使用"+"號連起來.
          ?*null常量
          ?表示變量的值為空
          ?*undefined常量
          ?表示一個變量還沒有被復值時的狀態,或某個對象的屬性不存在.

          =========================================================================================
          變量

          ?*定義一個變量,系統就會為之分配一塊內存,程序可以用變量名來表示這塊內存中的數據.
          ?*聲明變量用var關鍵字
          ?例如: var x; (這個時候就是undifeined)
          ?*聲明變量的同時為其賦值
          ?例如: var name="lisi";
          ?*對已賦值的變量賦于一個其他類型的數據
          ?例如: name=123;
          ?*不事先聲明變量而直接使用
          ?例如: x=1234;

          算術運算符

          ?*+ 加法運算符或正值運算符,例如, x+5, +6.
          ? 它還能實現多個字符串的想加,也能將字符串與其他的數據類型連成一個新的字符串,條件
          ? 條件是該表達式中至少有一個字符串,例如: "x"+123的結果為"x123".
          ?*- 減法運算符或負預算符,例如, 7-3, -8.
          ?** 乘法運算符,例如, 3*7.
          ?*/ 除法運算符,例如 9/4.
          ?*% 求模運算符(算術中的求余),例如, 5%2
          ?*++將變量值加1后再將結果賦給這個變量,分為兩種,例如a++和++a
          ?*--用法與++預算符一樣
          ?

          賦值運算符
          ?
          ? 賦值運算符的作用是將一個值賦給一個變量,最常用的是"=",還可以由"="運算符和其他的一些
          ? 預算符組合成新的運算符,例如:
          ? "+=","-="等.

          比較運算符

          ? *>大于
          ?? 當左邊的操作數大于右邊的操作數時,返回true.
          ? *<小與
          ? *=
          ? *<=
          ? *>=
          ? *==
          ? *!=
          ? 注意: 不要把"=="寫成"="

          邏輯運算符
          ?
          ? *&&
          ? 邏輯與,當左右兩邊的操作數都為true時,返回值為true,否則為false.
          ? *||
          ? 邏輯或,當左右兩邊的操作數都為false時,返回值為false,否則為true.
          ? *!
          ? 邏輯非,當操作數為ture的時,返回值為false,否則為true.

          ========================================================================
          程序流程控制
          ?
          ?*順序結構
          ?*if條件選擇語句
          ?*switch選擇語句
          ?*while循環語句
          ?*do while語句
          ?*for循環語句
          ?*break與continue語句

          ?if條件語句語法1:
          ?if(條件語句)
          ?{
          ?? 執行語句塊
          ?}
          ?注意:if(x==null)或if(typeof(x)=="undefined")可以簡寫成if(!x)
          ?if條件語句語法2:
          ?if(條件語句)
          ?{
          ?? 執行語句塊1
          ?}
          ?else
          ?{
          ?? 執行語句塊2
          ?}
          ?變量=布爾表達式? 語句1 :語句2
          ?if條件語句語法3:
          ?if(條件語句)
          ?{
          ?? 執行語句塊1
          ?}
          ?else if(條件語句2)
          ?{
          ?? 執行語句塊2
          ?}
          ?....
          ?else if(條件語句塊n)
          ?{
          ?? 執行語句塊n
          ?}
          ?else
          ?{
          ?? 執行語句塊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");??
          ? }

          ===================================================================
          函數
          ?
          ?*函數的作用與定義
          ?*全局變量與局部變量
          ?*參數個數可變的函數
          ?*創建動態函數
          ?*JavaScript中的系統函數

          ? 定義一個函數的語法如下:
          ? function 函數名 (參數列表)
          ? {
          ???? 程序代碼
          ???? return 表達式;
          ? }
          ? 對函數調用的幾種方式:
          ? 1.函數名(傳遞函數的參數1,傳遞給函數的參數2,.....)
          ? 2.變量=函數名(傳遞函數的參數1,傳遞給函數的參數2,.....)
          ? 3.對于有返回值的函數調用,也可以在程序中直接使用返回結果,例如:
          ? alert("sum="+square(2,3));

          ? 全局變量與局部變量,看下面的代碼:
          ? <script language="javascript">
          ?? var msg="全局變量";
          ?? function show()
          ?? {
          ????? msg="局部變量";
          ?? }
          ?? show();
          ?? alert(msg);
          ? </script>

          ? 參數個數可變的的函數:
          ?<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代表了傳遞給函數的所有參數的所有集合。當函數的個數不確定,
          ? 獲得參數個數很多,你又不想為每個參數定義一個變量,那么你就可以定義一個
          ? 像上面那個一樣的,定義一個為空的參數名,在內部用循環來實現。
          ?創建動態函數的語法:
          ?var varName=new Function(argument1,....,lastArgument);
          ?說明:
          ?所有的參數都必須是字符串型的,最后的參數必須是這個動態函數的功能程序代碼.
          ?例子:
          ?<script>
          ?? var square=new Function("x","y",
          ??????????? "var sum;sum=x*x+y*y; return sum;");
          ?? alert(square(3,2));
          ?</script>
          ?動態函數有什么作用,在什么情況下使用?
          ?
          ?JavaScript中的系統函數:
          ?.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方法
          ? 第一字符串按指定的進制轉換成一個整數,語法格式為:parseInt(numString,[redix])。
          ? 如果沒有指定第二個參數,則前綴為'Ox'的字符串被視為十六進制,前綴為'O'的字符串
          ? 被視為八進制,所有其他的字符串被視為十進制。
          ? 例如: alert(parseInt("123abc",10));
          ?.parseFloat方法
          ? 將一個字符串轉換為小數。
          ?.isNaN方法(用與檢測)
          ?.escape方法(用于對文本的簡單加密)
          ? 返回對一個字符串進行編碼后的結果字符串。所有空格,標點,重音符號以及任何其他
          ? ASCII字符都用%xx編碼替換,其中xx等于表示該字符的Unicode編碼的十六進制數,字符
          ? 值大于255字符以%uxxxx格式表示。
          ?.unescape方法
          ? 將一個用escape方法編碼的字符串解碼成原始字符串。
          ?.eval方法
          ? 將其中的參數字符串作為一個JavaScript表達式執行。

          =======================================================================
          ? 對象
          ?*對象與對象實例
          ?*構造方法與this關鍵字的作用
          ?*在函數中修改參數值的問題

          ?對象與對象實例
          ?.對象中所包含的變量就是對象的屬性,對象中所包含的對屬性進行操作的函數就是對象的
          ? 方法,對象的屬性和方法都叫對象的成員。
          ?.對象是某一類事物的描述,是抽象的概念;而對象實例是一類事物中的具體個例。
          ?.能夠被用來創建對象實例的函數就是對象的構造函數,只要定義一個對象的構造函數,就
          ? 等于被定義了一個對象。使用new關鍵字和對象的構造函數就可以創建對象實例,語法格式
          ? 如下: var ObjectInstance = new ObjName(傳遞給該對象的實際參數列表)。
          ? <script language="javascript">
          ? function Person()
          ? {
          ??? //這是一個構造函數
          ? }
          ? var person1 = new Person();? //創建了一個實例變量(對象實例)
          ? 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成員,我們可以在其他地方像
          ??????????????????????? //調用方法一樣來調用
          ? person1.say();
          ? </script>

          看下面的例子:
          <html>
          ?<script language="javascript">
          ?? //定義一個構造函數,也就是對象的名稱為person
          ?? function Person()
          ?? {
          ?? }
          ?? //創建一個對象實例
          ?? var person1=new Person();
          ?? person1.age=18;
          ?? person1.name="zxy";
          ?? //編寫一個成員方法
          ?? function sayFunc()
          ?? {
          ????? var x="name";
          ????? eval("alert(person1."+ x + ");");? //這個字符串中的內容將被作為JavaScipt代碼來執行
          ????? alert(person1.name+":"+person1.age);
          ?? }
          ?? person1.say=sayFunc; //把方法名賦值給了person1.say成員
          ?? person1.say=sayFunc(); //寫了括號表示執行sayFunc()函數在復值
          ?? person1.say();
          ?</script>
          </html>

          ===================================================================
          構造方法與this關鍵字

          ?.為一個對象實例新增加的屬性和方法,不會增加到同一個對象所產生的其它對象實例上。
          ?.所有的實例對象在創建都會自動調用構造函數,在構造函數中增加的屬性和方法會被
          ? 增加到每個對象實例上。
          ?.對象實例是使用new關鍵字創建的,在構造方法中不要有返回結果的return語句。
          ?.調用對象的成員方法時,需要使用“對象實例.成員方法"的形式,很顯然,用作成
          ? 員方法的函數被調用,一定伴隨有某個對象實例。this關鍵字代表某個成員方法執行時
          ?? ,引用該方法的當前對象實例,所以,this關鍵字一般只在用作對象成員方法的
          ? 函數中出現。
          ? <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">
          ?? //定義一個構造函數
          ?? function Person(name,age)
          ?? {
          ???? this.name=name;//當前的對象實例增加一個成員變量name,成員變量的通過Person()參數name傳遞進來
          ???? this.age=age;//當前的對象實例增加一個成員變量age,成員變量的通過Person()參數age傳遞進來
          ???? this.say=sayFunc; //增加一個sayFunc()函數
          ?? }
          ?? function sayFunc()
          ?? {
          ???? alert(this.name + ":" + this.age);
          ?? }
          ?? //創建一個對象實例
          ?? var person1=new Person("張三",18);
          ?? person1.say();? //調用person1的say()成員方法
          ?? var person2=new Person("李四",29);
          ?? person2.say();? //調用person2的say()成員方法
          ?</script>
          </html>

          =====================================================================
          在函數中修改參數值的問題

          ?將基本數據類型的變量作為函數參數傳遞的情況:
          ?<script language="javascript">
          ? function changeValue(x)
          ? {
          ??? x=5;
          ? }
          ? var x=3;
          ? changeValue(x);
          ? alert(x);
          ?</script>
          注意: 在函數changeValue(x)中的x=5并不能修改主程序中的x值,函數接受的參數
          就相當于一個局部變量,當函數調用完也就沒用了。所以該程序的結果為x=3;如果
          我們把一個對象的實例傳遞給函數,而我們有在函數中修改了對象實例的屬性,那么
          最后的結果也會變化的。

          posted @ 2006-06-05 22:34 藍色Saga 閱讀(279) | 評論 (0)編輯 收藏

          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
          主站蜘蛛池模板: 肇州县| 湘阴县| 廉江市| 陇南市| 陆河县| 中阳县| 永兴县| 抚顺市| 菏泽市| 惠水县| 鄂温| 张北县| 将乐县| 扶沟县| 汝阳县| 图们市| 灌云县| 林西县| 长顺县| 浦城县| 延庆县| 湟中县| 康马县| 孝感市| 家居| 吉木乃县| 拉萨市| 炎陵县| 金塔县| 辉县市| 观塘区| 义乌市| 罗定市| 平安县| 大洼县| 安远县| 辰溪县| 纳雍县| 四川省| 改则县| 兴海县|