對象到基本類型的轉換
- 首先,不管何時,當一個非空對象用在布爾環境中的時
if((typeof o == "object") && (o instanceof Date))
候,它都轉換爲false。這對於所有的對象(包括數組和函數)都是成立的,即便對那些用來表示應轉換爲false的基本類型值的包裝對象來說,也是如此。例如,所有如下對象在布爾環境中的時候都轉換爲true。
- new Boolean(false)
- new Number(0)
- new String("")
- new Array
- 基本類型傳址,對象傳址
- String爲immutable,看起來是對象類型,但是表現起來反而類似傳值
- Array、Function是特殊的對象,所以傳址
- 可以用var語句多次聲明同一個變量
- 嘗試讀取一個未聲明的變量的值會發生錯誤
- 嘗試給一個未用var聲明的變量賦值,javascript會隱式聲明該變量。但是要注意,隱式聲明的變量總是被創建爲全局變量,及時改變量只在一個函數體內使用。要防止創建局部變量的使用創建全局變量,就必須在函數體內部使用var語句。
var scope = "global";
function checkscope(){
scope = "local";//local
document.write(scope);
myscope = "local";//declare a new global var implicitly
document.write(myscope);
}
checkscope();
document.write(scope);
document.write(myscope);//print "local"
函數使用了局部作用域內定義的全局變量,可是全局作用域內的函數更本不知道它怎麼來的,所以這是一件很危險的事,所以在局部作用域內都要使用var聲明。- 沒有塊級作用域
1. 每個JavaScript執行環境都和一個和它關聯在一起的作用域鏈(scope chain)。這個作用域鏈式一個對象列表或對象鏈。當javascript代碼需要查詢變量x的值時,它開始查看該鏈的第一個對象。如果那個對象有一個名爲x的屬性,那麼就採用那個屬性的值。如果第一個對象沒有名字x的屬性,那麼會繼續查詢聯衆的第二個對象,以此類推。在javascript的頂層代碼中(不屬於任何函數定義的代碼)。作用域鏈只由一個對象構成,那就是全局對象。
第五章 對象和數組
- 屬性枚舉使用for......in
- 檢出屬相的存在性兩種方法
- in運算符
if("x" in o)o.x = 1
- 直接判斷屬性是否存在
if(o.x !==undefined)o.x = 1;
但是,一個屬性頁可能已經存在但是未定義,如:
這種情況下,兩種方式執行效果就不一致了o.x = undefined
- 刪除屬性使用delete
delete o.x
- "."運算符和“[]”運算符都可以作爲屬性訪問運算符,但是後者使用字符串作爲參數,更加靈活
- Constructor:每個對象都有一個constructor屬性,它引用了初始化這個對象的構造函數。可以使用如下的代碼來確定一個位置的類型:
instanceof 運算符檢查constructor屬性的值,因此上面的代碼可以寫成:if((typeof o == "object") && (o.constructor == Date))
if((typeof o == "object") && (o instanceof Date))
- valueOf():和toString()很像,用在JS需要把一個對象轉換爲某種數據類型,也就是一個數字而不是一個字符串的時候,才調用該方法。如果一個對象用在需要一個基本數值的環境中,JS會自動調用該方法。默認的valueOf什麼也不做。
- hasOwnProperty()方法:如果一個對象用一個單獨的字符串參數所指定的名字來本地定義一個非繼承的屬性,hasOwnProperty()方法就返回true。否則返回false。
- isPrototypeOf()方法:如果isPrototypeOf()方法所屬的對象時參數的原型對象,那麼,該方法就返回true。否則,它返回false,如:
var o = {} Object.prototype.isPrototypeOf(0)//true:o.constructor == Object Object.isPrototypeOf(0);//false o.isPrototypeOf(Object.ptototype) Function.prototype.isPrototypeOf(Object)
- 數組的聲明:
A. 直接 “[ ]”聲明var a = [] var b = [1,2,3,4,5] var c = [1,,3]//長度爲3,中的的元素爲undefied
B.使用new聲明var x = new Array()//無參數 var y = new Array(1,2,3,"testing")//指定前幾個值 var c = new Array(10)//指定數組初始長度,然後每個都設置爲undefined
- 數組的長度是動態的
- 關於內存分配:javascript中的數組時稀疏的。這意味着數組的下標不必落在一個連續的數字範圍內,只由那些真正存儲在數組中的元素才能夠有javascript是吸納分配到內存。比如:
js職位下標0和10000分配了內存,中間的0~9,999並沒有分配內存a[0] = 1; a[10000] = "this si element 10,000"
- 數組的刪除:
delete運算符吧一個數組元素設置爲undefined,但元素本身還繼續存在。要真正刪除一個元素,以使下標高於它的所有元素都向下遷移到較低的下標位置,需要使用以下一組方法:
A.shift() 刪除數組第一個元素
B.pop()刪除最後一個元素
C.splice()從一個數組中刪除一個連續範圍內的元素。 - 其他方法:
1. join(var):轉化爲字符串,中間參數爲希望的分隔符
2.split(var):和join相反
3.reverse():講調到元素的順序並返回顛倒後的數組。它在原數組上執行這一操作,而不是創建一個重排元素的新數組。
4.sort():在原數組上排序
5.slice(start,end):返回片段,end可以爲負數,-1表示數組最後一個元素
6.push()和pop():實現棧的操做
7.unshift()和shift():和push、pop類似,只不過是在數組的頭部進行元素的插入和刪除 - 6.