雖然執行環境的類型總共只有兩種——全局和局部(函數),但還有其他方法延長作用域鏈,有些語句可以在作用域鏈的前端臨時增加一個變量對象,執行后會被移除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
-------------------------------------------今天任務沒完成,欠債的感覺不好受,還要付出更多的時間才行吶,好惆悵好憂傷-----------------------------------------------------