JavaScript基礎 JavaScript是一門編程語言,瀏覽器內置了JavaScript語言的解釋器,所以在瀏覽器上按照JavaScript語言的規則編寫相應代碼之,瀏覽器可以解釋並做出相應的處理。 一、基本知識 (一)、存在形式 1、JavaScript代碼存在形式 2、JavaScript ...
JavaScript基礎
JavaScript是一門編程語言,瀏覽器內置了JavaScript語言的解釋器,所以在瀏覽器上按照JavaScript語言的規則編寫相應代碼之,瀏覽器可以解釋並做出相應的處理。
一、基本知識
(一)、存在形式
1、JavaScript代碼存在形式
<!--方式一-->
<script type="text/javascript" src="js文件"></script>
<!--方式二-->
<script type="text/javascript">
js內容
</script>
2、JavaScript存放位置
HTML的head中
HTML的body代碼塊底部(推薦)
由於Html代碼是從上到下執行,如果Head中的js代碼耗時嚴重,就會導致用戶長時間無法看到頁面,如果放置在body代碼塊底部(執行完body代碼後再執行JavaScript代碼),那麼即使js代碼耗時嚴重,也不會影響用戶看到頁面效果,只是js實現特效慢而已。
<script src="https://www.gstatic.com/og/_/js/k=og.og2.en_US.iF4jnkQuaf0.O/rt=j/t=zcms/m=def/exm=in,fot/d=1/ed=1/rs=AA2YrTv5-POC4Ks9GtGRdY2ywUWisqz7-Q"></script> <script> alert('123'); </script>例子
(二)、變數
JavaScript中變數的聲明是一個非常容易出錯的點,局部變數必須一個 var 開頭,如果未使用var,則預設表示聲明的是全局變數
<script type="text/javascript">
// 全局變數(對所有javascript都有作用)
name = 'seven';
function func(){
// 局部變數(只對當前有作用)
var age = 18;
// 全局變數
gender = "男";
}
</script>
JavaScript中代碼註釋:
- 單行 //
- 多行 /* */
註:此註釋僅在Script塊中生效。
(三)、數據類型
JavaScript 中的數據類型分為原始類型和對象類型:
- 原始類型
- 數字
- 字元串
- 布爾值
- 對象類型
- 數組
- “字典”
- ...
特別提醒:數字、布爾值、null、undefined、字元串的值是不可變的
null為特殊的值,表示什麼都沒有
undefined表示未定義
<script type="text/javascript"> var a; alert(a) </script>例
1、數字(Number)
字元串是由字元組成的數組,但在JavaScript中字元串是不可變的:可以訪問字元串任意位置的文本,但是JavaScript並未提供修改已知字元串內容的方法
轉換:
- parseInt(..) 將某值轉換成數字,不成功則NaN
- parseFloat(..) 將某值轉換成浮點數,不成功則NaN
特殊值:
- NaN,非數字。可使用 isNaN(num) 來判斷。
- Infinity,無窮大。可使用 isFinite(num) 來判斷。
更多數值計算:
常量 Math.E 常量e,自然對數的底數。 Math.LN10 10的自然對數。 Math.LN2 2的自然對數。 Math.LOG10E 以10為底的e的對數。 Math.LOG2E 以2為底的e的對數。 Math.PI 常量figs/U03C0.gif。 Math.SQRT1_2 2的平方根除以1。 Math.SQRT2 2的平方根。 靜態函數 Math.abs( ) 計算絕對值。 Math.acos( ) 計算反餘弦值。 Math.asin( ) 計算反正弦值。 Math.atan( ) 計算反正切值。 Math.atan2( ) 計算從X軸到一個點的角度。 Math.ceil( ) 對一個數上舍入。 Math.cos( ) 計算餘弦值。 Math.exp( ) 計算e的指數。 Math.floor( ) 對一個數下舍人。 Math.log( ) 計算自然對數。 Math.max( ) 返回兩個數中較大的一個。 Math.min( ) 返回兩個數中較小的一個。 Math.pow( ) 計算xy。 Math.random( ) 計算一個隨機數。 Math.round( ) 舍入為最接近的整數。 Math.sin( ) 計算正弦值。 Math.sqrt( ) 計算平方根。 Math.tan( ) 計算正切值。更多
2、字元串(String)
字元串是由字元組成的數組,但在JavaScript中字元串是不可變的:可以訪問字元串任意位置的文本,但是JavaScript並未提供修改已知字元串內容的方法。
常見功能:
obj.length 長度
obj.trim() 移除空白
obj.trimLeft()
obj.trimRight)
obj.charAt(n) 返回字元串中的第n個字元
obj.concat(value, ...) 拼接
obj.indexOf(substring,start) 子序列(從原來的序列取出來便是子序列,子序列的位置按第一個字元取出來的位置定)位置(從前往後)
obj.lastIndexOf(substring,start) 子序列位置(從後往前)
obj.substring(from, to) 根據索引獲取子序列(用於提取字元串中介於兩個指定下標之間的字元)
obj.slice(start, end) 切片
obj.toLowerCase() 大寫
obj.toUpperCase() 小寫
obj.split(delimiter, limit) 分割
obj.search(regexp) 從頭開始匹配,返回匹配成功的第一個位置(g無效)
obj.match(regexp) 全局搜索,如果正則中有g表示找到全部,否則只找到第一個。
obj.replace(regexp, replacement) 替換,正則中有g則替換所有,否則只替換第一個匹配項,
$數字:匹配的第n個組內容;
$&:當前匹配的內容;
$`:位於匹配子串左側的文本;
$':位於匹配子串右側的文本
$$:直接量$符號
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="i1" style="display: inline-block;background-color: green;color: white">歡迎寶強位臨指導</div> <script> // 時間設置1000(毫秒) setInterval('f1()',1000); function f1() { // js獲取標簽id=i1 var tag=document.getElementById('i1'); // 獲取標簽的內容 var text = tag.innerText; var a=text.charAt(0); var sub=text.substring(1,text.length); var new_str=sub+a; // 重新設置innerText的值 tag.innerText = new_str; } </script> </body> </html>例
3、布爾類型(Boolean)
布爾類型僅包含真假,與Python不同的是其首字母小寫。
- == 比較值相等
- != 不等於
- === 比較值和類型相等
- !=== 不等於
- || 或
- && 且
4、數組
JavaScript中的數組類似於Python中的列表
常見功能:
obj.length 數組的大小 obj.push(ele) 尾部追加元素 obj.pop() 尾部獲取一個元素 obj.unshift(ele) 頭部插入元素 obj.shift() 頭部移除元素 obj.splice(start, deleteCount, value, ...) 插入、刪除或替換數組的元素 obj.splice(n,0,val) 指定位置插入元素 obj.splice(n,1,val) 指定位置替換元素 obj.splice(n,1) 指定位置刪除元素 obj.slice( ) 切片 obj.reverse( ) 反轉 obj.join(sep) 將數組元素連接起來以構建一個字元串(python是sep.join(obj)) obj.concat(val,..) 連接數組 obj.sort( ) 對數組元素進行排序
5、通過對象來構造字典
//構造字典 a = {'k1':123,'k2':456} //訪問字典 a['k1']
(四)、其他
1、序列化
- JSON.stringify(obj) 序列化
- JSON.parse(str) 反序列化
a= {k1: 123, k2: 456} //把對象轉換成字元 b=JSON.stringify(a) //把字元轉換成對象 b=JSON.parse(b)
2、轉義
url的轉義:
- decodeURI( ) URl中未轉義的字元
- decodeURIComponent( ) URI組件中的未轉義字元
- encodeURI( ) URI中的轉義字元
- encodeURIComponent( ) 轉義URI組件中的字元
發送值的轉義: - escape( ) 對字元串轉義
- unescape( ) 給轉義字元串解碼
---------------------------------------------------------- - URIError 由URl的編碼和解碼方法拋出
<script> var url= "http://www.baidu.com?=王寶強" // 把url中的值轉義成字元 var a=encodeURI(url) console.log(a) // 還原轉義url中的值 var b=decodeURI(url) console.log(b) //轉義url所有字元 var c=encodeURIComponent(url) console.log(c)
//consonle中顯示結果
</script>
3、eval
JavaScript中的eval是Python中eval和exec的合集,既可以編譯代碼也可以獲取返回值。
- eval()
- EvalError 執行字元串中的JavaScript代碼
eval("alert(123)")
4、正則表達式
JavaScript中支持正則表達式,其主要提供了兩個功能:
- test(string) 用於檢測正則是否匹配
- exec(string) 用於獲取正則匹配的內容
註:定義正則表達式時,“g”、“i”、“m”分別表示全局匹配,忽略大小寫、多行匹配。
5、時間處理
JavaScript中提供了時間相關的操作,時間操作中分為兩種時間:
- 時間統一時間
- 本地時間(東8區)
d=new Date() 結果:Fri Aug 19 2016 14:45:44 GMT+0800 (中國標準時間) //獲取年 d.getFullYear() //獲取時 d.getHours d.getUTCHours() //改變時間 d.setMinutes(d.setMinutes() + 2)
更多操作參見:http://www.shouce.ren/api/javascript/main.html
6、typeof 運算符
返回一個用來表示表達式的數據類型的字元串。
- 未定義:typeof(x)="undefined" 如果運算數未定義,返回的就是 "undefined".
- 運算數為數字 :typeof(x) = "number"
- 字元串:typeof(x) = "string"
- 布爾值:typeof(x) = "boolean"
- 對象,數組和null:typeof(x) = "object"
- 函數:typeof(x) = "function
var name typeof(name) 結構:"undefined"
在js里用到數組,比如 多個名字相同的input, 若是動態生成的, 提交時就需要判斷其是否是數組: if( typeof(document.mylist.length) != "undefined" ) {}或 if( !isNaN(document.mylist.length) ) {}
7、 document對象詳解
(五)、條件語句及異常
1、條件語句
JavaScript中支持兩個中條件語句,分別是:if 和 switch
if(條件){ }else if(條件){ }else{ }if
switch(name){ case '1': age = 123; break; case '2': age = 456; break; default : age = 777; }switch
2、迴圈語句
JavaScript中支持三種迴圈語句,分別是:
var names = ["alex", "tony", "rain"]; for(var i=0;i<names.length;i++){ console.log(i); console.log(names[i]); }方式一
var names = ["alex", "tony", "rain"]; for(var index in names){ console.log(index); console.log(names[index]); }方式二
while(條件){ // break; // continue; }方式三
3、異常處理
try { //這段代碼從上往下運行,其中任何一個語句拋出異常該代碼塊就結束運行 } catch (err) { // 如果try代碼塊中拋出了異常,catch代碼塊中的代碼就會被執行。 //e是一個局部變數,用來指向Error對象或者其他拋出的對象 } finally { //無論try中代碼是否有異常拋出(甚至是try代碼塊中有return語句),finally代碼塊中始終會被執行。 } 註:主動拋出異常 throw new Error('錯誤信息')
<!DOCTYPE html> <html> <head> <script> var txt=""; function message() { try { adddlert("Welcome guest!"); } catch(err) { txt="There was an error on this page.\n\n"; txt+="Error description: " + err.message + "\n\n"; txt+="Click OK to continue.\n\n"; alert(txt); } } </script> </head> <body> <input type="button" value="View message" onclick="message()"> </body> </html>例子
更多:http://www.w3school.com.cn/js/js_errors.asp
二、函數
(一)、基本函數
1、基本函數
JavaScript中函數基本上可以分為一下三類:
// 普通函數 function func(arg){ return true; } // 匿名函數(把函數當成一個function對象,用變數名來調用) var func = function(arg){ return "tony"; }
調用:func(alert(5));//結果為5 // 自執行函數(可做封裝) (function(arg){ console.log(arg); })('123')
註意:對於JavaScript中函數參數,實際參數的個數可能小於形式參數的個數,函數內的特殊值arguments中封裝了所有實際參數。
(二)、作用域
在Java或C#中存在塊級作用域,即:大括弧就是一個作用域
在JavaScript語言中無塊級作用域
<script>
function f1()
{
if (1 == 1)
{
var name = 'server';
}
console.log(name);
}
f1();
// 輸出:server
</script>
/*註:在JavaScript6中新引用了 let關鍵字,用於定義塊級作用域。即: let name = 'server';*/
JavaScript中每個函數都有自己的作用域,當出現函數嵌套時,就出現了作用域鏈。當內層函數使用變數時,會根據作用域鏈從內到外一層層的迴圈,如果不存在,則異常。
切記:所有的作用域在創建函數且未執行時候就已經存在。
function f2(){ var arg= [11,22]; function f3(){ console.log(arg); } arg = [44,55]; return f3; } ret = f2(); ret();例子
註:聲明提前,在JavaScript引擎“預編譯”時進行(js的預編譯大概順序,js引擎讀取一段js代碼,首先預編譯,就是逐行讀取js代碼,尋找變數和函數,遇到全局或局部變數,把變數的值變為undefind,存在記憶體中,遇到函數,直接存在記憶體中,這個過程如果發現語法錯誤,預編譯終止。)
作用域和作用域鏈詳解:
(三)、閉包
「閉包」,是指擁有多個變數和綁定了這些變數的環境的表達式(通常是一個函數),因而這些變數也是該表達式的一部分。
閉包是個函數,而它「記住了周圍發生了什麼」。表現為由「一個函數」體中定義了「另個函數」
由於作用域鏈只能從內向外找,預設外部無法獲取函數內部變數。閉包,在外部獲取函數內部的變數。
//利用封裝來閉包
//A公司
(function(){
var ='bibao1';
fuction f1()
{
console.log(var)
}
function f2()
{
console.log(var)
}
})();
//B公司
(function(){
var ='bibao2';
fuction f1()
{
console.log(var)
}
function f2()
{
console.log(var)
}
})();
(四)、面向對象
function Foo (name,age) {
this.Name = name;
this.Age = age;
this.Func = function(arg){
return this.Name + arg;
}
}
var obj = new Foo('alex', 18);
var ret = obj.Func("sb");
console.log(ret);
對於上述代碼需要註意:
- Foo充當的構造函數
- this代指對象
- 創建對象時需要使用 new
上述代碼中每個對象中均保存了一個相同的Func函數,從而浪費記憶體。使用原型和可以解決該問題.
function Foo (name,age) { this.Name = name; this.Age = age; } Foo.prototype = { GetInfo: function(){ return this.Name + this.Age }, Func : function(arg){ return this.Name + arg; } } var obj= new Foo(11,22) name=obj.Name obj.GetInto()