JavaScript高級程序設計4.pdf


雖然執行環境的類型總共只有兩種——全局和局部(函數),但還有其他方法延長作用域鏈,有些語句可以在作用域鏈的前端臨時增加一個變量對象,執行后會被移除try-catch語句的catch塊和with語句

with語句會將指定對象添加到作用域鏈中,catch會創建一個新的變量對象

function buildUrl ()

{

var qs="?debug=true";

with (location)

  {

  var url=href + qs;

  }

return url;

}

在此,with語句接受的是location對象,因此其變量對象就包含了location對象的所有屬性和方法,而這個變量對象被添加到了作用域鏈的前端。

JavaScript沒有塊級作用域

if (true)

{

var color="blue";

}

alert(color);  //"blue"

if語句的變量聲明會將變量添加到當前執行環境(這里是全局執行環境)

由for語句創建的變量 i 即使在for循環結束后依然存在與循環外部的執行環境中

1聲明變量如果沒有使用var,該變量會自動添加到全局環境 

2查詢標識符由當前執行環境開始搜索

找出那些不再繼續使用的變量,然后釋放其占用的內存

常見的是 標記清除 進入環境標記,離開環境清除

引用計數 是跟蹤記錄每個值被引用的次數

對循環引用使用手工消除的方式myObject.element=null;element.someObject=null;

對數據的值設置null叫做解除引用,適用大多數全局變量和全局變量的屬性,局部變量會在他們離開執行環境后被解除引用

第5章  引用類型

引用類型的值(對象)是引用類型的一個實例,在ECMAScript中,引用類型是一種數據結構,用於將數據和功能組織在一起

新對象是使用new操作符后跟一個構造函數來創建的var person = new object();

Object的實例是存儲和傳輸的理想選擇

創建Object有兩種方式:

第一種是new操作符后跟Object構造函數

var person = new Object();

person.name = "Nicholas";

person.age = 29;

另一種方式是使用對象字面量表示法,它是對象定義的一種簡寫形式,目的在於簡化創建包含大量屬性的對象的過程

var person =

{

name:"Nicholas",

age:29

};

ECMAScript中的表達式上下文指的是能夠返回一個值(表達式),左花括號表示一個表達式或者代碼塊的開始

對象字面量也是向函數傳遞大量可選參數的首選方式

function displayInfo (args)

{

  var output="";

  if(typeof args.name=="string")

    {

    output +="Name: "+args.name+ "\n";

    }

  if(typeof args.age=="number")

    {

    output +="Age: "+args.age+ "\n"

    }

  alert(output);

}

displayInfo({

    name:"Ncholas",

    age:29

    });

displayInfo({

    name:"Greq"

    });

一般來說,訪問對象的屬性都是點表示法,也是很多面向對象語言中通用的語法,在JavaScript中也可以使用方括號表示法來訪問對象的屬性,將訪問的屬性以字符串的形式放在方括號中

alert(person.name)  //"Nicholas"

alert(person.["name"])  //"Nicholas"

方括號語法主要優點是可以通過變量來訪問屬性

var propertyName="name";

alert(person[propertyName]);//"Nicholas"

如果屬性名中包含會導致語法錯誤的字符,或者屬性名使用的是關鍵字或保留字,也可以使用方括號表示法

person["first name"]="Nicholas";  //由於"first name"包含一個空格,所以不能使用點表示法來訪問

創建數組的基本方式有兩種,第一種是使用Array構造函數

var colors= new Array();

如果預先知道數組的要保存的項目數量

var colors= new Array(20); //自動創建length值為20的數組

也可以向Array構造函數傳遞數組中應該包含的項

var colors= new Array("red","blue","green");

創建數組的第二種基本方式是使用數組字面量表示法 由一些包含數組項的方括號表示,多個數組項之間以逗號隔開

var colors= ["red","blue","green"];

var name= [];

var value= [1,2,]    //在最后一個數組項加逗號會導致創建一個包含2或3項的數組

在讀取和設置數組的值時,要用方括號並提供基於0的數字的索引

var color= ["red","blue","green"];  //定義

alert(colors[0]);    //讀取

color[1]="black";    //修改

color[3]="gray";    //新增

數組的length是可讀寫的,通過設置這個屬性可以向數組移除或者添加新項

var colors=["red","blue","green"];

colors.length=2;

alert(colors[2]);    //undefined

 

var colors=["red","blue","green"];

colors[colors.length]="black";    //添加第3項

colors[colors.length]="gray";    //添加第4項

 

var colors=["red","blue","green"];

colors[99]="black";

alert(colors.length);    //100

檢測數組

一般可以使用if (value instanceof Array)

{

//對數組的操作

}

instanceof操作符的問題在於,它假定單一的全局執行環境,如果網頁包含多個框架就有多個不同的執行環境,就有多個不同版本的Array構造函數

為了解決這個問題ECMAScript5新增了Array.isArray()方法,這個方法能確定某個值到底是不是數組,而不管是在哪個全局執行環境中創建的

if(Array.isArray(value))

{

//對數組的操作

}

轉換方法

所有對象都具有toLocaleString()、toString()、valueOf()方法

var colors=["red","blue","green"];

alert(colors.toStrings());  //red,blue,green

alert(colors.valueOf());  //red.blue,green

alert(colors);  //red,blue,green

 

var person1=

{

  toLocaleString:function()

    {

      return "Nikolaos";

    },

  toString:function()

    {

      return"Nicholas";

    }

};

var person2=

{

  toLocaleString:function()

    {

      return"Grigorios";

    },

   toString:function()

    {

      return"Greg";

    }

};

var people = [person1,person2];

alert(people);

alert(people.toString());

alert(people.toLocaleString());

join()方法可以使用不同的分隔符來構建這個字符串

var colors=["red","blue","green"];

alert(colors.join(","));  //red,green,blue

alert(colors.join("||"));  //red||green||blue

棧是一種LIFO(Last-In-First-Out后進先出)數據結構,棧中項的推入和移除只在棧的頂部發生,ECMAScript為數組提供push()和pop()方法實現類似的功能

var colors=new Array();

var count=colors.push("red","green");  //推入兩項

alert(count);  //2

count=colors.push("black");  //推入另一項

alert(count);  //3

var item=colors.pop();

alert(item);  //"black"

alert(colors.length);  //2

-------------------------------------------今天任務沒完成,欠債的感覺不好受,還要付出更多的時間才行吶,好惆悵好憂傷-----------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM