隨筆 - 59  文章 - 70  trackbacks - 0
          <2008年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(5)

          隨筆分類

          隨筆檔案

          搜索

          •  

          積分與排名

          • 積分 - 173766
          • 排名 - 340

          最新評論

          閱讀排行榜

          評論排行榜

          上篇文章講了 js 中的一些概念(詞法結構) 數據類型(部分)。

          這章我們 繼續 . 然后了解下 js 中操作數據 函數的 作用域。

          ?

          1, 對象跟基本類型之間的轉換:

          不管何時,只是對象非空,在布爾環境中都為 true.

          ;

          new Boolean(false);

          new Number(0);

          new String(“”);

          new Array();

          上面雖然內部值是 false, 但對象的值是 true;

          Object à valueOf() à toString()

          其中 Date 類,是先執行 toString() 轉換。

          ?

          2,js 中操作一個數據值:

          任何語言都有自己的操作數據的方法;

          Js 也不例外, js 3 種重要的方式來操作一個數據值。

          1)?????? 復制它。例如把它賦給一個新的變量。

          2)?????? 把它作為參數傳遞給一個函數或方法。

          3)?????? 可以和其他值比較大小。

          ?

          Js 通過傳值和傳址 2 種方式操作這些數據的值。

          從名稱可以看處,傳值 是通過傳遞值來操作數據。在賦值的過程中,對實際的值進行了拷貝,存儲到一個新的變量中。拷貝的值和原來的值是 2 份完全獨立的值。所以如果你改變了拷貝的值,并不會影響原來的值。當比較大小時候,通常進行琢個字節比較。

          傳址 從名字來看,就是通過傳遞地址來操作數據。在賦值的過程中,對實際的值的地址(可以說是引用)進行了拷貝,他們不是完全的獨立,所以如果你通過引用改變了值,那么原始的值也會改變。當比較大小的時候,通常是看他們是否引用同一個地址來比較。

          簡單的傳址例子:

          var a = new Date();

          alert(a.getDate());

          var b = a ;

          b.setDate(21);

          alert(a.getDate()) // 輸出 21

          ?

          3, 一般來說:

          基本數據類型通過傳值來操作的。(如果忘記了哪些是基本數據類型,可以往回看。)

          對象數據類型通過傳址來操作的。(比如 數組和函數)

          例子:

          <script>

          // 傳值

          a=1;

          b=a;

          b=2;

          alert(a); // 輸出 1

          ?

          // 傳址

          x=[1,2];

          y=x;? // 賦給 y 的只是 x 的一個引用,而不是 x 本身。數組已經在語句中被賦值了,執行過這段代碼后,仍舊只有一個數組對象,只不過我們有 2 個對他的引用了。

          y[0]=2;

          alert(x[0] +" | " +x[1]);? // 輸出 2 ?|? 2

          </script>

          其中我們必須注意字符串:

          js 中字符串是通過傳址來復制和傳遞的,而他們是通過傳值來比較的。

          對象和數組是用傳值來傳遞的,只不過傳遞的這個值實際是一個引用,而不是對象本身

          總結 :

          類型

          復制

          傳遞

          比較

          數字

          傳值

          傳值

          傳值

          布爾

          傳值

          傳值

          傳值

          字符串

          不可變

          不可變

          傳值

          對象

          傳址

          傳址

          傳址

          不可變:在 JS 中,沒有方法去改變字符串值的內容。

          對字符串來說,傳值還是傳址,意義不大。

          ?

          4, 垃圾收集機制:

          Js 中自動釋放內存。

          比如:

          var? s? =”heelo”;

          var? b?? = s.toUpperCase();

          s=b; // 運行到這里后, js 會自動檢測不再使用某個對象,因為 s=b 了,所以 js 會自動釋放字符串“ heelo ”所占的存儲空間。即我們不能再獲取原始的 “heelo” 值; .

          ?

          5 , javascript 變量:

          Js 是非類型的。它的變量可以放任何類型的值。

          ?

          變量的聲明:

          var? a? ;

          var? b? ;

          或者

          var? a , b ;

          或者

          var? a=0 , b=1 ;

          ?

          重復聲明 是合法的,

          如果 遺漏聲明 , js 會隱式的聲明該變量。當然隱式聲明的變量是全局變量

          ?

          6 , 變量的作用域:

          Js 2 種:全局和局部。

          從名字的定義可以知道,全局變量的作用域是全局性的。

          js 代碼中,處處都有定義。

          局部變量的作用域是局部的。

          在函數體內定義。

          ?

          同名的局部變量的優先級比同名的全局變量,下面的例子說明了這點:

          var a ="abc"; // 全局變量

          function check(){

          var a = "efg"; // 同名的局部變量

          document.write(a);

          }

          check(); //? 輸出 efg

          ?

          看一個比較經典的例子 :

          ? ?var scope = "global";

          ?function f(){

          ???? alert(scope); // 輸出 undefined

          ???????? ?var scope = "local";

          ???????? ?alert(scope); // 輸出 local

          }

          f();

          ?

          為什么第一個會輸出 undefined 呢?

          因為 js 規定當 局部變量和全局變量的名稱相同的時候,函數體內的同名全局變量會被隱藏

          那么剛才例子 實際 等價于:

          function f(){

          var scope;

          ?alert(scope);

          ???????? ?scope = "local";

          ???????? ?alert(scope);

          ?}

          f();

          OK ,如果你看懂了這個例子,說明你對局部和全局的一些區別稍微了解了。

          ?

          7 , 變量的作用域:

          從里到外:

          詞法作用域

          作用域鏈

          變量查找

          var x = 1;

          function f(){

          ? var y =2 ;

          ?function g(){

          ?? var z =3 ;

          }

          ?

          }

          調用 g() 對象 ; z =3 ;

          ?

          ?

          ?

          ?

          調用 f() 對象 ; y =2 ;

          ?

          ?

          ?

          ?


          全局變量 ? x = 1??

          在此定義了嗎?

          ????????

          ? ??????????

          獲得值

          ? 在此定義了嗎?

          ????????

          ? ??????????

          獲得值

          在此定義了嗎?

          ????????

          ? ??????????

          獲得值

          ? 未定義

          ?

          8 , 客戶端全局變量:

          ? 在客戶端 js 中, Window 對象代表瀏覽器窗口,他是一個全局對象。、

          比如 ; 我們常用的 parseInt() , Math() 都是 Window 對象定義的屬性。

          ?

          Js 允許多個全局變量的執行環境,每個環境有不同的全局對象。

          比如:客戶端 js 的每個獨立的瀏覽器窗口,或者同一窗口的不同幀。

          其中的代碼都運行在自己的執行環境中,具有自己的全局對象。

          當然可以使用 表達式 parent.frames[0].x ?; 來引用第一個幀中的全局變量 x? ; 這樣就把不同幀中的代碼聯系起來了。

          不過這里有安全性問題。

          ?

          總結 ;

          主要講了 傳值和傳址 函數的作用域

          對新手來說稍微難理解些。如果還有不懂,可以 google 搜索資料

          posted on 2008-10-13 15:19 JasonChou 閱讀(256) 評論(0)  編輯  收藏 所屬分類: html
          主站蜘蛛池模板: 诸暨市| 湘潭县| 许昌市| 儋州市| 兴城市| 上蔡县| 本溪| 石渠县| 筠连县| 乡宁县| 万荣县| 娱乐| 刚察县| 丁青县| 岳普湖县| 西乌珠穆沁旗| 玉树县| 德清县| 水城县| 抚顺市| 昂仁县| 玉屏| 漯河市| 绥江县| 盱眙县| 东方市| 桑日县| 城固县| 柞水县| 五家渠市| 庆安县| 昌图县| 汝阳县| 英山县| 溆浦县| 安福县| 准格尔旗| 星子县| 南昌市| 右玉县| 宝丰县|