2008年10月20日
昨日有媒體爆料10月20日微軟將在中國再次對盜版WindowsXP進行打擊,并首次對盜版Office進行驗證,盜版軟件用戶將被采取黑屏等手段予以打擊。但是僅僅幾個小時之后,就有網友發帖稱“10月20日未到,微軟反盜xp黑屏補丁已被破解”。
從今日中午開始,網上各大論壇相繼出現標題為“10月20日未到,微軟反盜xp黑屏補丁已被破解”的網帖,網友警告微軟稱“想玩奉陪到底”,并在隨后的帖子中給出了由一名為“f1098”的網友帶來的破解方法:開始-運行-輸入REGEDIT回車,在左邊欄中找到HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsNT
CurrentVersionWinlogonNotifyWgaLogon項,將整個WgaLogon項刪除即可。
2008年10月15日
上篇文章講了 js 中的 傳值和傳址 和 函數的作用域 .
這章我們來探討 js 中 的變量,表達式,和運算符 還有一些 js 語句。
升級中 ……
1, 表達式:
最簡單的表達式:直接量或者變量名。 var a =1;
直接量表達式的值:本身。
變量表達式的值:該變量所存放或引用的值。
2 , 運算符:
一元運算符: 比如 - 3
二元運算符: 比如 3+4
三元運算符: 比如 ? :
新手常遇到的問題:
遞增運算符:
比如:
i = 1 ;
j = ++ i ; // 前遞增運算,即先對運算數進行遞增,然后再去計算。
// 輸出 i =2; j=2 ;
i = 1 ;
j = i ++; // 后遞增運算,即先去計算,然后再對運算數進行遞增。
// 輸出 i =2; j=1 ;
3, 相等運算符:
= : 賦值運算符;
== : 相等運算符;
=== : 等同運算符;
值 NaN 永遠不會與任何值相等,包括自己。
alert(NaN == NaN); //false NaN 意思為 Not a Number
要檢測一個值是否是 NaN, 可以使用全局函數 isNaN();
另外新手要注意:
var a =[1,2,3];
var b =[1,2,3];
document.write(a==b); // 輸出 false .( 這個其實是 第一章講的內容。 )
// 雖然值相同,類型相同,但址不同。
--------------------------------------------------------
var a =[1,2,3];
var b = a ;
var c = a ;
document.write(b===c);// 輸出 true;
--------------------------------------------------------
var a = "1";
var b = true ;
document.write(a==b); // 輸出 true
document.write(a===b); // 輸出 false ; 值相同, 類型不同
4, 比較運算符:
要注意的就是字符串是進行琢個比較。
而且會區分大小寫。
如果你的需求是不區分大小寫:
可以使用 String.toLowerCase() // 純小寫
String.toUpperCase() // 純大寫 轉換后 ,然后再去比較 .
5, in 運算符:
要注意的是:左邊的值是其右邊對象的屬性。
比如:
var a = { x : 1 , y : 2 };
var b = “x” in a ; // true
var c = “toString” in a ; // true . 左邊的值是其右邊對象的屬性。
6 instanceof 運算符:
要注意的是:左邊的運算數是一個對象,右邊的運算數是對象類的名字。
比如:
var a = new Date()
a instanceof Date; // true
a instanceof Object ; // true
a instanceof Number ; // false
7, 3 元條件運算符:
要注意的是:第一個運算數必須是一個布爾值。
X > 0 ? 3 : 2 ;
8, typeof 運算符:
要注意的是:由于 typeof 對所有的對象和數組都是返回 object;
所以它只能區分對象和原始數據類型時才有用。
要區別一種對象類型和另一種對象類型,可以使用 instanceof 和 constructor 屬性。
9, delete 運算符:
要注意的是:并不是所有的屬性和變量都能刪除。
比如:
用 var 語句聲明的變量不能被刪除。
另外 ; 當 delete 刪除一個不存在的屬性時,返回 true ;( ^_^ ,這個比較搞笑。)
var a = 1;
alert( delete a ); // 返回 false
alert( delete a.x ); // 返回 true
還有一個應該注意:
Delete 所能影響的只是屬性值,并不能影響被這些屬性引用的對象。
比如:
var my =new Object();
my.height = new Date();
my.width = my.height;
delete my.height ;
document.write(my.width);// my.width 仍然是引用 Date 對象
10,void 運算符:
void 的一個用途: 專門生成 undefined 值、
alert( void(0) )
alert( void(1) ) // 都輸出 undefined
這里的 undefined 實際是 void() 運算后的 值 。
考慮到向后兼容性,用表達式 void 0 比使用 undefined 屬性更有用 .
11, 異常處理:
拋出異常: throw
捕捉異常: try / catch / finally
If(x>0)
throw new Error(“x must not be negative!”);
try{
}
catch(e){
}
finally{ // 總是被最后執行 。通常進行 消除操作。
}
12,with 語句:
var form = frame[1].document.forms[0];
form.name.value = “ “;
form.address.value =” “;
這樣可以使用 with 語句代替 ;
比如:
with(frame[1].document.forms[0]) {
name.value = “ “;
address.value =” “;
}
當然書上強烈不推薦使用 with , 呵呵。效率低,問題多多。
總結:
主要介紹了 js 中的變量,表達式,和運算符 還有一些 js 語句。
如果還有不懂,可以 google 搜索資料 . ( 學會使用搜索,你也就很厲害了。 )
轉眼間,學了 3 章了, 不知道大家感覺如何。
將就些吧,學習最重要的還是靠自己,不懂或者有疑問的地方馬上 寫例子測試,驗證。或者查資料。 這樣可能印象會更深入些。
加油 …….
上篇文章講了 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 ; 這樣就把不同幀中的代碼聯系起來了。
不過這里有安全性問題。
總結 ;
主要講了 傳值和傳址 和 函數的作用域 。
以前沒徹徹底底的看過js相關的學習資料,覺得很有必要再看看基礎的東西。一起來學習。
1 , javascript字符集:
javascript 采用的是 Unicode 字符集編碼。
為什么要采用這個編碼呢?
原因很簡單, 16 位的 Unicode 編碼可以表示地球人的任何書面語言。這是語言 國際化的一個重要特征。 ( 大家也許見過用中文寫腳本,比如: function 我的函數 () {} );
Javascript 中每個字符都是用 2 個字節表示的。(因為是 16 位編碼)
2 , 大小寫敏感:
js 是一種區分大小寫的語言。
注意下:以前我也犯過的錯誤。
HTML 是不區分大小寫的。經常看見有人這么寫 ,
<input type=”button” onClick=”a()” /> (這樣寫是對的)
如果放到 JS 中,就必須使用 onclick (小寫哦!)
同時 XHTML 中也只能使用小寫。
這個我們并不需要太關心,象這種問題,其實都可以自己給自己定一個標準,自己寫程序的時候全部小寫。
另外每行程序后 分號 也是一樣,我們都寫上。
3 , 注釋:
單行:
// 注釋 1
/* 注釋 2 */
多行:
/* 注釋 3
* 注釋 3
* 注釋 3
*/
4 , 標識符:
標識符就是一個名字,用來命名變量和函數。
規則:第一個字母必須是字母,下劃線 (_) ,或美圓符號 ($) 。
為什么第一個字母不能為數字?
如果第一個為數字, js 很容易就把它當作數字處理了,那么命名就沒意義了, js 規定了后,就很容易的區分了標識符和數字了。
5 , 直接量:
就是程序中直接顯示出來的數據值。
比如: 12 , 1.2 , “ hello “ , true , null , [1,2,3,4]
這些都是直接量。
6 , 保留字和關鍵字:
具體是哪些,可以去 google.cn 。
其實我們只要不取一些特郁悶的名字,都不會沖突的。
7 ,js 數據類型:
3 種基本的類型;數字,字符串和布爾值。
2 種小數據類型: null 和 undefined . ( 為什么叫小數據類型?因為他們只定義了一個值 )
1 種復合類型: object. ( 在這個類型中,它的值可以是基本數據類型,也可以是復合類型,比如其他的 object. )
注意:在對象中有一個特殊的對象 ----function.( 它是一個可以執行代碼的對象 .)
其他的一些對象 :
數組:
Date 類 : 是日期的對象。
RegExp 類: 正則表達式的對象。
Error 類: js 中發生錯誤的對象。
8 , 使用數據類型注意的地方:
1): 數字:
由于數字有什么 8 進制, 10 進制, 16 進制等。。。
八進制: var num = 011; // 以 "0" 開頭
十六進制: var num =0x1f; // 以 "0x" 開頭
所以對于 js 這個都能識別的語言來說,就必須得注意。
alert(377); // 377
alert(0377); //255 = 3 * 64 + 7 * 8 + 7 * 1
進行算術運算有個重要的對象: Math.
具體可以去網上下載手冊,查詢里面的方法。
2 個有用的函數: isNaN() 和 isFinite()
isNaN() : 用于檢查其參數是否是非數字值。 // 提示:是非數字哦。 (not a number)
document.write( isNaN (0) ) // 返回 false
document.write( isNaN (5-2) ) // 返回 false
document.write( isNaN ("Hello") ) // 返回 true
isFinite(number) 函數用于檢查其參數是否是無窮大。
如果 number 是有限的,則返回 true. 如果 number 是 NaN( 非數字 ) 或者是無窮大,則返回 false;
2): 字符:
‘you’re right’;
這樣寫的話 js 會誤以為 在 you 字母后就結束了,引起錯誤。
所以當遇到這種情況的時候,必須用到轉義。
我們可以這么寫:
‘you"’re right’;
另外:你可以 google.com 搜索 轉義序列表 。
字符串的簡單操作例子:
var a = "cssrain";
var b = a.charAt(a.length-1); // 從字符串 a 中截取最后一個字符。 輸出: n
var c = a.substring(0 , 2); // 從字符串 a 中截取第 1 , 2 個字符。 輸出: cs
var d = a.indexOf('s'); // 從字符串 a 中查找 第一個 s 出現的位置。 輸出: 1
從例子可以看出,基數都是從 0 開始的。
var e = a.substring( a.length-1 ); // 可以看出, substring 第 2 個參數不寫的話,
// 默認 是到最后。
var f = a.substring( a.length-1 , a.length);// 等價于
3): 數字跟字符之間的轉換:
數字轉字符:
var number_to_string = number + “ ”; // 方法 1 :添加一個空的字符串。
var number_to_string =String(number); // 方法 2 :使用 String() 函數。
var number_to_string =number. toString(); // 方法 3 :使用 toString() 函數。
注: toString() 方法默認是以 10 進制轉換。
如果要使用 8 進制轉換可以 這么寫: number. toString(8);
字符轉數字:
var string_to_number = string – 0 ; // 方法 1 : 字符串減去 0 。
var string_to_number = Number(string) ; // 方法 2 :使用 Number () 函數。
var string_to_number = parseInt(string) ; // 方法 3 :使用 parseInt () 函數。
方法 1 中不能 用 string+0 ; 這樣會導致字符串拼接,而不是類型轉換。
方法 2 中的 Number 函數轉換,比較嚴格。
比如:
var a = "19cssrain86";
var b = Number(a); // 輸出 NaN.
如果我們使用方法 3 。
var c = parseInt(a); // 輸出 19
可以看出 parseInt() 會自動忽略非數字的部分。
parseInt() 只取整數部分,忽略小數部分。
parseFloat() 會把小數部分也取到。
和 toString() 一樣, parseInt 也有進制,默認是 10 進制。
如果想使用 8 進制,可以這么寫: parseInt( “077” , 8 ); // 輸出 63 = 7 * 8 + 7
當字符以 0 開頭的時候,我們必須把 第二個參數 指明,不然 js 可能會以 8 進制去轉換。
4): 布爾類型:
布爾在數字環境中: true 轉換為 1 , false 轉換為 0 。
在字符環境中: true 轉換為 “true” , false 轉換為 “false” 。
布爾轉換:
var x_to_Boolean = Boolean(x); // 方法 1 :使用 Boolean () 函數。
var x_to_Boolean = !x; // 方法 2 :使用 感嘆號。
5): 函數的定義:
方法 1 :普通定義
function square(x){
return x*x;
}
方法 2 :函數直接量定義
var square = function(x){ return x*x; } // 推薦使用
方法 3 :構造參數
var square = new Function(“x”,”return x*x;”); // 效率低
6): 對象:
如果有一個名為 cssrain 的對象 , 他有一個高度 height 的屬性。
那么我們可以這么引用:
cssrain.height;
還可以使用關聯數組定義: cssrain[“height”];
創建對象:
方法 1 :
var point = new Object();
point.x = 3;
point.y = 5;
方法 2 :使用對象直接量
var point = {x:3 , y:5 }
當然 json 也可以咯。
對象在字符的環境下,會調用 toString() 方法。
數字環境下,會調用 valueOf() 方法。
布爾環境下,非空對象為 true;
7): 數組:
常規數組:以非負整數做為下標。 image[0]
關聯數組:以字符做為下標。如: image[“width”]
js 不支持多維數組,但數組里面可以嵌套數組。
創建數組:
方法 1 :
var a = new Array();
a[0] = “1”;
a[1] = 2;
a[2] = { x:1, y:3};
方法 2 :
var a = new Array(“1” , 2 , {x:1,y:3} );
注意下:如果只傳了一個參數;比如 var a = new Array(3);
那么它是表示: 3 個未定義元素 的 新數組。
方法 3 :使用數組直接量
var a =[“1” , 2 , {x:1 , y :3 }]; // 注意外面的 括號 , 不是花 括號。
8):null 和 undefined :
null 表示無值;
undefined : 使用一個并未聲明的變量,或者使用了已經聲明的變量但未賦值或者使用了一個并不存在的屬性。
undefined==null
如果要區分:
可以使用 === 或者 typeof 運算符。
9 , 新手常遇到的疑惑:
var s =”you are right”;
var b = s.substring(s.lastIndexOf(“ ”)-1 , s.length);
疑惑: s 是對象還是字符串,為什么字符串會有方法呢?
回答: s 是字符串。之所以有方法 ,是因為 string 類型 有一個相應的對象類( String )。
同樣數字和布爾都有相應的 Number , Boolean 類。
Js 會內部進行相應的包裝對象。 String 對象就替換了原始的字符串。
總結:
簡單了介紹了 js 中的一些概念(詞法結構) 和 數據類型(部分)。
好了,今天就說到這里, 明天我們 繼續。 ^_^ 。
一、包含語句<%@include file="uri" %>
可包含的文件可以是任何后綴的文件如,*.inc、*.htm、*.jsp、*.txt等。例如,%@include file="hello.inc"%、<%@include file="bottom.jsp"%>。
注:include指令包含的是文件的內容,所以被包含文件中不能包含有<html><head><body>三個標簽。
二、另一個包含語句<jsp:include page="uri"/>
用法主要有三種:
<jsp:include page="url"/>
<jsp:include page="url" flush="true"/>
<jsp:include page="url" flush="true">
<jsp:parameter name="name" value="value"/>
</jsp:include>
三、比較兩種包含語句的不同
1、后者又叫標簽指令形式。和html有些類似,必須要有</jsp:XXX>結束或是/>結束。
2、后者,可以向被包含頁傳遞參數。當需要向被包含頁傳遞參數時,被包含頁必須是jsp動態頁面。
3、接收包含語名的方法還是 request.getParameter("參數名");
4、后者如果包含的頁面是jsp文件,而自動處理,如果包含的是靜態內容,則直接包含進來。
四、學到這里的時候可能經常有些面試題:請問jsp中兩種包含語句的區別?
1、理解一:
<%@include file="uri"%>,靜態包含,不管被包含頁面的內容如何,先包含時行一起執行后發送到客戶端。
<jsp:include page="uri"/>,動態包含,能自動區分被包含文件是靜態還是動態的。執行時,如果是靜太資源則和上面一樣把內容加進來,如果是動態資源,則先各自處理之后將處理后的結果包含在一起。