1,對象跟基本類型之間的轉換:
不管何時,只是對象非空,在布爾環境中都為true.
如;
new Boolean(false);
new Number(0);
new String(“”);
new Array();
上面雖然內部值是false,但對象的值是true;
Object à valueOf() à toString()
其中Date類,是先執行toString()轉換。
2,js中操作一個資料值:
任何語言都有自己的操作資料的方法;
Js也不例外,js有3種重要的方式來操作一個資料值。
複製它。例如把它賦給一個新的變數。
把它作為參數傳遞給一個函數或方法。
可以和其他值比較大小。
Js通過傳值和傳址2種方式操作這些資料的值。
從名稱可以看處,傳值 是通過傳遞值來操作資料。在賦值的過程中,對實際的值進行了拷貝,儲存到一個新的變數中。拷貝的值和原來的值是2份完全獨立的值。所以如果你改變了拷貝的值,並不會影響原來的值。當比較大小時候,通常進行琢個位元組比較。
傳址 從名字來看,就是通過傳遞地址來操作資料。在賦值的過程中,對實際的值的地址(可以說是引用)進行了拷貝,他們不是完全的獨立,所以如果你通過引用改變了值,那麼原始的值也會改變。當比較大小的時候,通常是看他們是否引用同一個地址來比較。
簡單的傳址例子:
var a = new Date();
alert(a.getDate());
var b = a ;
b.setDate(21);
alert(a.getDate()) // 輸出21
3,一般來說:
基礎資料型別 (Elementary Data Type)通過傳值來操作的。(如果忘記了哪些是基礎資料型別 (Elementary Data Type),可以往回看。)
對象資料類型通過傳址來操作的。(比如 數組和函數)
例子:
<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 ;這樣就把不同幀中的代碼聯絡起來了。
不過這裡有安全性問題。
總結;
主要講了 傳值和傳址 和 函數的範圍 。