儘管 ECMAScript 是一個重要的標準,但它並非 JavaScript 惟一的部分,固然,也不是惟一被標準化的部分。實際上,一個完整的 JavaScript 實現是由如下 3 個不一樣部分組成的:javascript
簡單地說,ECMAScript 描述瞭如下內容:css
1 {#1 直接編寫#} 2 <script> 3 alert('hello yuan') 4 </script> 5 {#2 導入文件#} 6 <script src="hello.js"></script>
在javascript中變量是弱類型的,不像java中須要強制定義變量類型html
聲明變量時不用聲明變量類型. 全都使用var關鍵字;java
var i;
一行能夠聲明多個變量.而且能夠是不一樣類型.node
var name="yuan", age=20, job="lecturer";
聲明變量時 能夠不用var. 若是不用var 那麼它是全局變量.python
變量命名規則jquery
首字符只能是字母,下劃線,$美圓符 三選一,且區分大小寫,x與X是兩個變量 如下標記法選一種便可 Camel 標記法 首字母是小寫的,接下來的字母都以大寫字符開頭。例如: var myTestValue = 0, mySecondValue = "hi"; Pascal 標記法 首字母是大寫的,接下來的字母都以大寫字符開頭。例如: Var MyTestValue = 0, MySecondValue = "hi"; 匈牙利類型標記法 在以 Pascal 標記法命名的變量前附加一個小寫字母(或小寫字母序列),說明該變量的類型。例如,i 表示整數,s 表示字符串,以下所示「 Var iMyTestValue = 0, sMySecondValue = "hi";
每行結束時加分號面試
註釋 支持多行註釋和單行註釋. /* */ //正則表達式
使用{}來封裝代碼塊windows
常量 :直接在程序中出現的數據值
標識符:
簡介 最基本的數據類型 不區分整型數值和浮點型數值 全部數字都採用64位浮點格式存儲,至關於Java和C語言中的double格式 能表示的最大值是±1.7976931348623157 x 10308 能表示的最小值是±5 x 10 -324
整數:
在JavaScript中10進制的整數由數字的序列組成
精確表達的範圍是
-9007199254740992 (-253) 到 9007199254740992 (253)
超出範圍的整數,精確度將受影響
浮點數:
使用小數點記錄數據
例如:3.4,5.6
使用指數記錄數據
例如:4.3e23 = 4.3 x 1023
16進制和8進制數的表達
16進制數據前面加上0x,八進制前面加0
16進制數是由0-9,A-F等16個字符組成
8進制數由0-7等8個數字組成
16進制和8進制與2進制的換算
簡介
是由Unicode字符、數字、標點符號組成的序列
字符串常量首尾由單引號或雙引號括起
JavaScript中沒有字符類型
經常使用特殊字符在字符串中的表達
字符串中部分特殊字符必須加上右劃線\
經常使用的轉義字符 \n:換行 \':單引號 \":雙引號 \\:右劃線
String數據類型的使用
<script> var str="\u4f60\u597d\n歡迎來到\"JavaScript世界\""; alert(str); </script>
簡介 Boolean類型僅有兩個值:true和false,也表明1和0,實際運算中true=1,false=0 布爾值也能夠看做on/off、yes/no、1/0對應true/false Boolean值主要用於JavaScript的控制語句,例如 if (x==1){ y=y+1; }else { y=y-1; }
Undefined 類型 Undefined 類型只有一個值,即 undefined。當聲明的變量未初始化時,該變量的默認值是 undefined。 當函數無明確返回值時,返回的也是值 "undefined"; Null 類型 另外一種只有一個值的類型是 Null,它只有一個專用值 null,即它的字面量。值 undefined 其實是從值 null 派生來的,所以 ECMAScript 把它們定義爲相等的。 儘管這兩個值相等,但它們的含義不一樣。undefined 是聲明瞭變量但未對其初始化時賦予該變量的值,null 則用於表示還沒有存在的對象(在討論 typeof 運算符時,簡單地介紹過這一點)。若是函數或方法要返回的是對象,那麼找不到該對象時,返回的一般是 null。 var person=new Person() var person=null
JavaScript屬於鬆散類型的程序語言 變量在聲明的時候並不須要指定數據類型 變量只有在賦值的時候纔會肯定數據類型 表達式中包含不一樣類型數據則在計算過程當中會強制進行類別轉換 數字 + 字符串:數字轉換爲字符串 數字 + 布爾值:true轉換爲1,false轉換爲0 字符串 + 布爾值:布爾值轉換爲字符串true或false
強制類型轉換函數
函數parseInt: 強制轉換成整數 例如parseInt("6.12")=6 ; parseInt(「12a")=12 ; parseInt(「a12")=NaN ;parseInt(「1a2")=1 函數parseFloat: 強制轉換成浮點數 parseFloat("6.12")=6.12 函數eval: 將字符串強制轉換爲表達式並返回結果 eval("1+1")=2 ; eval("1<2")=true
ECMAScript 提供了 typeof 運算符來判斷一個值是否在某種類型的範圍內。能夠用這種運算符判斷一個值是否表示一種原始類型:若是它是原始類型,還能夠判斷它表示哪一種原始類型。
函數typeof :查詢數值當前類型 (string / number / boolean / object ) 例如typeof("test"+3) "string" 例如typeof(null) "object " 例如typeof(true+1) "number" 例如typeof(true-false) "number" ECMAScript 運算
加(+)、 減(-)、 乘(*) 、除(/) 、餘數(% ) 加、減、乘、除、餘數和數學中的運算方法同樣 例如:9/2=4.5,4*5=20,9%2=1
-除了能夠表示減號還能夠表示負號 例如:x=-y
+除了能夠表示加法運算還能夠用於字符串的鏈接 例如:"abc"+"def"="abcdef"
遞增(++)遞減(--)
//假如x=2,那麼x++表達式執行後的值爲3,x--表達式執行後的值爲1 //i++至關於i=i+1,i--至關於i=i-1 //遞增和遞減運算符能夠放在變量前也能夠放在變量後:--i i = 1 console.log(i++) //1 console.log(i) //2 console.log(++i) //3
一元加減法
=============一元加減法================= var a=1; var b=1; a=-a; console.log(a) //-1 var c="10"; console.log(typeof (c)); //string c=+c; //類型轉換 console.log(typeof (c)); //number var d="yuan"; d=+d; console.log(d); //NaN //NaN:屬於Number類型的一個特殊值,當遇到將字符串轉成數字無效時,就會獲得一個NaN數據 console.log(typeof(d));//Number NaN特色: var n=NaN; console.log(n>3); console.log(n<3); console.log(n==3); console.log(n==NaN); console.log(n!=NaN);//NaN參與的全部的運算都是false,除了!=
等於 ( == ) 、不等於( != ) 、 大於( > ) 、 小於( < ) 大於等於(>=) 、小於等於(<=) 與 (&&) 、或(||) 、非(!) && 1 = 1 1 || 1 = 1 && 0 = 0 1 || 0 = 1 && 0 = 0 0 || 0 = 0 !0=1 !1=0
邏輯 AND 運算符(&&)
邏輯 AND 運算的運算數能夠是任何類型的,不止是 Boolean 值。
若是某個運算數不是原始的 Boolean 型值,邏輯 AND 運算並不必定返回 Boolean 值:
邏輯 OR 運算符(||)
與邏輯 AND 運算符類似,若是某個運算數不是 Boolean 值,邏輯 OR 運算並不必定返回 Boolean 值
賦值 = JavaScript中=表明賦值,兩個等號==表示判斷是否相等 例如,x=1表示給x賦值爲1 if (x==1){...}程序表示當x與1相等時 if(x==「on」){…}程序表示當x與「on」相等時 配合其餘運算符造成的簡化表達式 例如i+=1至關於i=i+1,x&=y至關於x=x&y
執行類型轉換的規則以下:
在比較時,該運算符還遵照下列規則:
var bResult = "Blue" < "alpha"; alert(bResult); //輸出 true
比較運算符兩側若是一個是數字類型,一個是其餘類型,會將其類型轉換成數字類型.
比較運算符兩側若是都是字符串類型,比較的是最高位的asc碼,若是最高位相等,繼續取第二位比較.
var temp=new Object();// false;[];0; null; undefined;object(new Object();) if(temp){ console.log("yuan") }else { console.log("alex") }
全等號不執行類型轉換。
全等號由三個等號表示(===),只有在無需類型轉換運算數就相等的狀況下,才返回 true
非全等號由感嘆號加兩個等號(!==)表示,只有在無需類型轉換運算數不相等的狀況下,才返回 true。
if-else基本格式 if (表達式){ 語句1; ...... }else{ 語句2; ..... } 功能說明 若是表達式的值爲true則執行語句1, 不然執行語句2
switch基本格式 switch (表達式) { case 值1:語句1;break; case 值2:語句2;break; case 值3:語句3;break; default:語句4; }
注意break
switch(x){ case 1:y="星期一"; break; case 2:y="星期二"; break; case 3:y="星期三"; break; case 4:y="星期四"; break; case 5:y="星期五"; break; case 6:y="星期六"; break; case 7:y="星期日"; break; default: y="未定義"; }
switch比else if結構更加簡潔清晰,使程序可讀性更強,效率更高。
1 首先要看一個問題,if 語句適用範圍比較廣,只要是 boolean 表達式均可以用 if 判斷;而 switch 只能對基本類型進行數值比較。二者的可比性就僅限在兩個基本類型比較的範圍內。 2 說到基本類型的數值比較,那固然要有兩個數。而後重點來了—— 3 if 語句每一句都是獨立的,看下面的語句: 4 if (a == 1) ... 5 else if (a == 2) ... 6 這樣 a 要被讀入寄存器兩次,1 和 2 分別被讀入寄存器一次。因而你是否發現其實 a 讀兩次是有點多餘的,在你所有比較完以前只須要一次讀入寄存器就好了,其他都是額外開銷。可是 if 語句必須每次都把裏面的兩個數從內存拿出來讀到寄存器,它不知道你其實比較的是同一個 a。 7 因而 switch case 就出來了,把上面的改爲 switch case 版本: 8 switch (a) { 9 case 0: 10 break; 11 case 1: 12 } 13 14 總結: 15 16 1.switch用來根據一個整型值進行多路分支,而且編譯器能夠對多路分支進行優化 17 2.switch-case只將表達式計算一次,而後將表達式的值與每一個case的值比較,進而選 18 擇執行哪個case的語句塊 19 3.if..else 的判斷條件範圍較廣,每條語句基本上獨立的,每次判斷時都要條件加載 20 一次。 21 因此在多路分支時用switch比if..else if .. else結構要效率高。
for循環基本格式 for (初始化;條件;增量){ 語句1; ... } 功能說明 實現條件循環,當條件成立時,執行語句1,不然跳出循環體
for i in 不推薦使用
for (var i=1;i<=7;i++){ document.write("<H"+i+">hello</H "+i+"> "); document.write("<br>"); } ---------------------------------------------- var arr=[1,"hello",true]//var dic={"1":"111"} for (var i in arr){ console.log(i) console.log(arr[i]) }
doms=document.getElementsByTagName("p"); for (var i in doms){ console.log(i); // 0 1 2 length item namedItem //console.log(doms[i]) } //循環的是你獲取的th一個DOM元素集,for in用來循環對象的全部屬性,dom元素集包含了你上面輸出的屬性。 //若是你只要循環dom對象的話,能夠用for循環: for (var i=0;i<doms.length;i++){ console.log(i) ; // 0 1 2 //console.log(doms[i]) }
while循環基本格式 while (條件){ 語句1; ... } 功能說明 運行功能和for相似,當條件成立循環執行語句花括號{}內的語句,不然跳出循環
var i=1; while (i<=7) { document.write("<H"+i+">hello</H "+i+"> "); document.write("<br>"); i++; } //循環輸出H1到H7的字體大小
<script language="JavaScript"> /* sayhello是定義的函數名,前面必須加上function和空格*/ function sayHello(){ var hellostr; var myname=prompt("請問您貴姓?","苑"); hellostr="您好,"+myname+'先生,歡迎進入"探索之旅"!'; alert(hellostr); document.write(hellostr); } //這裏是對前面定義的函數進行調用 sayHello(); </script>
try { //這段代碼從上往下運行,其中任何一個語句拋出異常該代碼塊就結束運行 } catch (e) { // 若是try代碼塊中拋出了異常,catch代碼塊中的代碼就會被執行。 //e是一個局部變量,用來指向Error對象或者其餘拋出的對象 } finally { //不管try中代碼是否有異常拋出(甚至是try代碼塊中有return語句),finally代碼塊中始終會被執行。 } //注:主動拋出異常 throw Error('xxxx')
從傳統意義上來講,ECMAScript 並不真正具備類。事實上,除了說明不存在類,在 ECMA-262 中根本沒有出現「類」這個詞。ECMAScript 定義了「對象定義」,邏輯上等價於其餘程序設計語言中的類。
var o = new Object();
object對象:ECMAScript 中的全部對象都由這個對象繼承而來;Object 對象中的全部屬性和方法都會出如今其餘對象中
ToString() : 返回對象的原始字符串表示。
ValueOf() : 返回最適合該對象的原始值。對於許多對象,該方法返回的值都與 ToString() 的返回值相同。
包括:Array ,String , Date, Math, Boolean, Number Function, Global, Error, RegExp , Object
在JavaScript中除了null和undefined之外其餘的數據類型都被定義成了對象,也能夠用建立對象的方法定義變量,String、Math、Array、Date、RegExp都是JavaScript中重要的內置對象,在JavaScript程序大多數功能都是經過對象實現的
<script language="javascript"> var aa=Number.MAX_VALUE; //利用數字對象獲取可表示最大數 var bb=new String("hello JavaScript"); //建立字符串對象 var cc=new Date(); //建立日期對象 var dd=new Array("星期一","星期二","星期三","星期四"); //數組對象 </script>
自動建立字符串對象:
var str1="hello world"; alert(str1.length); alert(str1.substr(1,5)); //調用字符串的對象屬性或方法時自動建立對象,用完就丟棄
手工建立字符串對象
var str1= new String("hello word"); alert(str1.length); alert(str1.substr(1,3)); //採用new建立字符串對象str1,全局有效
string對象的屬性
var str1="String對象"; var str2=""; alert("str1長度 "+str1.length); alert("str2長度 "+str2.length); //獲取字符串長度 .length
string對象的方法
(1)格式編排方法返回值列表
書寫格式: String對象提供了一組針對HTML格式的方法,如x.anchor()返回錨定義字符串<a>x</a>, x.bold()返回粗體表示字符串<b>x</b>,x.sup()返回上標格式字符串<sup>x</sup>。 ----------------------------------------- var x="yuan"; var y="x.italics():"+x.italics(); document.write(y.fontsize(10));
(2)大小寫轉換
var str1="AbcdEfgh"; var str2=str1.toLowerCase(); var str3=str1.toUpperCase(); alert(str2); //結果爲"abcdefgh" alert(str3); //結果爲"ABCDEFGH"
(3)獲取指定字符
書寫格式 x.charAt(index) x.charCodeAt(index) 使用註解 x表明字符串對象 index表明字符位置 index從0開始編號 charAt返回index位置的字符 charCodeAt返回index位置的Unicode編碼 ---------------------- var str1="welcome to the world of JS! 苑昊"; var str2=str1.charAt(28); var str3=str1.charCodeAt(28); alert(str2); //結果爲"苑" alert(str3); //結果爲33489
(4)查詢字符串
//書寫格式 // //x.indexOf(findstr,index) //x.lastIndexOf(findstr) //------------------------------------- var str1="welcome to the world of JS!"; var str2=str1.indexOf("l"); var str3=str1.lastIndexOf("l"); alert(str2); //結果爲2 alert(str3); //結果爲18 //-------*********************************************************------- //書寫格式 // //x.match(regexp) // //x.search(regexp) // //使用註解 // //x表明字符串對象 // //regexp表明正則表達式或字符串 // //match返回匹配字符串的數組,若是沒有匹配則返回null // //search返回匹配字符串的首字符位置索引 //------------------------------------- var str1="welcome to the world of JS!"; var str2=str1.match("world"); var str3=str1.search("world"); alert(str2[0]); //結果爲"world" alert(str3); //結果爲15
(5)字符串處理
1 //截取子字符串 2 // 3 //書寫格式 4 // 5 //x.substr(start, length) 6 // 7 //x.substring(start, end) 8 // 9 //使用註解 10 // 11 //x表明字符串對象 12 // 13 //start表示開始位置 14 // 15 //length表示截取長度 16 // 17 //end是結束位置加1 18 // 19 //第一個字符位置爲0 20 21 22 var str1="abcdefgh"; 23 var str2=str1.substr(2,4); 24 var str3=str1.substring(2,4); 25 alert(str2); 26 //結果爲"cdef" 27 alert(str3); 28 //結果爲"cd" 29 30 //-------*********************************************************------- 31 //x.slice(start, end) 32 33 34 var str1="abcdefgh"; 35 var str2=str1.slice(2,4); 36 var str3=str1.slice(4); 37 var str4=str1.slice(2,-1); 38 var str5=str1.slice(-3,-1); 39 alert(str2); 40 //結果爲"cd" 41 alert(str3); 42 //結果爲"efgh" 43 alert(str4); 44 //結果爲"cdefg" 45 alert(str5); 46 //結果爲"fg"
//x.replace(findstr,tostr) var str1="abcdefgh"; var str2=str1.replace("cd","aaa"); alert(str2); //結果爲"abaaaefgh"
var str1="一,二,三,四,五,六,日"; var strArray=str1.split(","); alert(strArray[1]); //結果爲"二"
//y=x.concat(addstr) // //使用註解 // //x表明字符串對象 //addstr爲添加字符串 //返回x+addstr字符串 var str1="abcd"; var str2=str1.concat("efgh"); alert(str2); //結果爲"abcdefgh"
建立數組對象
Array 對象用於在單個的變量中存儲多個值。 語法: 建立方式1: var a=[1,2,3]; 建立方式2: new Array(); // 建立數組時容許指定元素個數也能夠不指定元素個數。 new Array(size);//if 1個參數且爲數字,即表明size,not content 初始化數組對象: var cnweek=new Array(7); cnweek[0]="星期日"; cnweek[1]="星期一"; ... cnweek[6]="星期六"; new Array(element0, element1, ..., elementn)//也能夠直接在創建對象時初始化數組元素,元素類型容許不一樣 var test=new Array(100,"a",true);
建立二維數組
var cnweek=new Array(7); for (var i=0;i<=6;i++){ cnweek[i]=new Array(2); } cnweek[0][0]="星期日"; cnweek[0][1]="Sunday"; cnweek[1][0]="星期一"; cnweek[1][1]="Monday"; ... cnweek[6][0]="星期六"; cnweek[6][1]="Saturday";
array對象的屬性
獲取數組元素的個數:length
var cnweek=new Array(7); cnweek[0]="星期日"; cnweek[1]="星期一"; cnweek[2]="星期二"; cnweek[3]="星期三"; cnweek[4]="星期四"; cnweek[5]="星期五"; cnweek[6]="星期六"; for (var i=0;i<cnweek.length;i++){ document.write(cnweek[i]+" | "); }
Array對象的方法
數組元素間拼接-join方法
//書寫格式 //x.join(bystr) //使用註解 // //x表明數組對象 //bystr做爲鏈接數組中元素的字符串 //返回鏈接後的字符串 //與字符串的split功能恰好相反 var arr1=[1, 2, 3, 4, 5, 6, 7]; var str1=arr1.join("-"); alert(str1); //結果爲"1-2-3-4-5-6-7"
數組元素添加-concat方法
var arr1 = [1, 3, 5,] var arr2 = arr1.concat([11, 22, 33], 'hello') console.log(arr1.toString()) //1,3,5 toString能夠轉爲字符串 console.log(arr2) //[1, 3, 5, 11, 22, 33, "hello"]
數組排序-reverse sort
//-------------數組reverse和sort----------- var arr1=[10, 100, 34, 88]; arr1.reverse() //數組反轉 console.log(arr1) //[88, 34, 100, 10] arr1.sort() //數組按最高位比大小,默認升序 console.log(arr1.toString()) //10,100,34,88 //數字間大小比較? //方法一 function intSort(a,b){ if (a>b){ return 1;//-1 } else if(a<b){ return -1;//1 } else { return 0 } } arr1.sort(intSort); alert(arr1); //10,34,88,100 // 方法二 function IntSort(a,b){ return a-b; } arr1.sort(intSort); alert(arr1);
數組切片-slice
//x.slice(start, end) // //使用註解 // //x表明數組對象 //start表示開始位置索引 //end是結束位置下一數組元素索引編號 //第一個數組元素索引爲0 //start、end可爲負數,-1表明最後一個數組元素 //end省略則至關於從start位置截取之後全部數組元素 var arr1=['a','b','c','d','e','f','g','h']; var arr2=arr1.slice(2,4); var arr3=arr1.slice(4); var arr4=arr1.slice(2,-1); alert(arr2.toString()); //結果爲"c,d" alert(arr3.toString()); //結果爲"e,f,g,h" alert(arr4.toString()); //結果爲"c,d,e,f,g"
刪除子數組
//x. splice(start, deleteCount, value, ...) // //使用註解 // //x表明數組對象 //splice的主要用途是對數組指定位置進行刪除和插入 //start表示開始位置索引 //deleteCount刪除數組元素的個數 //value表示在刪除位置插入的數組元素 //value參數能夠省略 var a = [1,2,3,4,5,6,7,8]; a.splice(1,2); //a變爲 [1,4,5,6,7,8] alert(a.toString()); a.splice(1,1); //a變爲[1,5,6,7,8] alert(a.toString()); a.splice(1,0,2,3); //a變爲[1,2,3,5,6,7,8] alert(a.toString());
數組的進出棧操做
//push pop這兩個方法模擬的是一個棧操做 //x.push(value, ...) 壓棧 //x.pop() 彈棧 //使用註解 // //x表明數組對象 //value能夠爲字符串、數字、數組等任何值 //push是將value值添加到數組x的結尾 //pop是將數組x的最後一個元素刪除 var arr1=[1,2,3]; arr1.push(4,5); alert(arr1); //結果爲"1,2,3,4,5" arr1.push([6,7]); alert(arr1) //結果爲"1,2,3,4,5,6,7" arr1.pop(); alert(arr1); //結果爲"1,2,3,4,5"
// unshift shift //x.unshift(value,...) //x.shift() //使用註解 // //x表明數組對象 //value能夠爲字符串、數字、數組等任何值 //unshift是將value值插入到數組x的開始 //shift是將數組x的第一個元素刪除 var arr1=[1,2,3]; arr1.unshift(4,5); alert(arr1); //結果爲"4,5,1,2,3" arr1. unshift([6,7]); alert(arr1); //結果爲"6,7,4,5,1,2,3" arr1.shift(); alert(arr1); //結果爲"4,5,1,2,3"
//java中數組的特性, 規定是什麼類型的數組,就只能裝什麼類型.只有一種類型. //js中的數組特性1: js中的數組能夠裝任意類型,沒有任何限制. //js中的數組特性2: js中的數組,長度是隨着下標變化的.用到多長就有多長.
函數建立
1 //函數建立的方式一: 2 function 函數名 (參數){ 函數體; 3 return 返回值; 4 } 5 //注意: 6 可使用變量、常量或表達式做爲函數調用的參數 7 函數由關鍵字function定義 8 函數名的定義規則與標識符一致,大小寫是敏感的 9 返回值必須使用return 10 11 12 13 //函數建立方式二 14 var 函數名 = new Function("參數1","參數n","function_body"); 15 //注意: 16 Function 類能夠表示開發者定義的任何函數。 17 雖然因爲字符串的關係,第二種形式寫起來有些困難,但有助於理解函數只不過是一種引用類型,它們的行爲與用 Function 類明確建立的函數行爲是相同的。
實例
function fun_one() { alert('hello') } fun_one() var fun_two = new Function('name',"alert('hello');") fun_two()
注意:js的函數加載執行與python不一樣,它是總體加載完纔會執行,因此執行函數放在函數聲明上面或下面均可以:
<script> //f(); --->OK function f(){ console.log("hello") } f() //----->OK </script>
Function 對象的 length 屬性
如前所述,函數屬於引用類型,因此它們也有屬性和方法。
好比,ECMAScript 定義的屬性 length 聲明瞭函數指望的參數個數。
alert(func1.length)
Function 對象的方法
Function 對象也有與全部對象共享的 valueOf() 方法和 toString() 方法。這兩個方法返回的都是函數的源代碼,在調試時尤爲有用。
函數的調用
function func1(a,b){ alert(a+b); } func1(1,2); //3 func1(1,2,3);//3 func1(1); //NaN func1(); //NaN //只要函數名寫對便可,參數怎麼填都不報錯. -------------------面試題----------- function a(a,b){ alert(a+b); } var a=1; var b=2; a(a,b) //報錯哦
function add(a,b){ console.log(a+b);//3 console.log(arguments.length);//2 console.log(arguments);//[1,2] } add(1,2) ------------------arguments的用處1 ------------------ function nxAdd(){ var result=0; for (var num in arguments){ result+=arguments[num] } alert(result) } nxAdd(1,2,3,4,5) // ------------------arguments的用處2 ------------------ function f(a,b,c){ if (arguments.length!=3){ throw new Error("function f called with "+arguments.length+" arguments,but it just need 3 arguments") } else { alert("success!") } } f(1,2,3,4,5)
匿名函數
// 匿名函數 var func = function(arg){ return "tony"; } // 匿名函數的應用 (function(){ alert("tony"); } )() (function(arg){ console.log(arg); })('123')
js的做用域和py類似,if while等控制語句並無本身做用域;而函數是有本身的做用域的;
if(1==1){ var s=12; } console.log(s);//12 // ---------------------- function f(){ var temp=666; } f(); console.log(temp);//Uncaught ReferenceError: temp is not defined
嵌套函數的做用域
1 var city = 'beijing'; 2 3 function func(){ 4 var city = 'shanghai'; 5 function inner(){ 6 var city = 'shenzhen'; 7 console.log(city); 8 } 9 inner(); 10 } 11 func();
var city = 'beijing'; function Bar(){ console.log(city); } function func(){ var city = 'shanghai'; return Bar; } var ret = func(); ret(); //beijing
var city = 'beijing'; function func(){ var city = "shanghai"; function inner(){ // var city = "langfang"; console.log(city); } return inner; } var ret = func(); ret();
做用域鏈(Scope Chain)
在JavaScript中,函數也是對象,實際上,JavaScript裏一切都是對象。函數對象和其它對象同樣,擁有能夠經過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],由ECMA-262標準第三版定義,該內部屬性包含了函數被建立的做用域中對象的集合,這個集合被稱爲函數的做用域鏈,它決定了哪些數據能被函數訪問。
var x=1; function foo() { var y = 2; function bar() { var z = 3; } } #bar的做用域鏈: barScopeChain=[bar.AO, foo.AO, global.VO]; #foo的做用域鏈: fooScopeChain=[foo.Ao, global.VO];
什麼是AO,VO?
在函數建立時,每一個函數都會建立一個活動對象Active Object(AO),全局對象爲Global Object(VO),建立函數的過程也就是爲這個對象添加屬性的過程,做用域鏈就是由這些綁定了屬性的活動對象構成的。
例如:找x變量;bar函數在搜尋變量x的過程當中,先從自身AO對象上找,若是bar.AO存在這個屬性,那麼會直接使用這個屬性的值,若是不存在,則會轉到父級函數的AO對象,也就是foo.AO
若是找到x屬性則使用,找不到繼續 在global.VO對象查找,找到x的屬性,返回屬性值。若是在global.VO中沒有找到,則會拋出異常ReferenceError
執行上下文。
函數在執行時會建立一個稱爲「執行上下文(execution context)」的內部對象,執行上下文定義了函數
執行時的環境。每一個執行上下文都有本身的做用域鏈,用於標識符解析,當執行上下文被建立時,而它的做用
域鏈初始化爲當前運行函數的[[Scope]]所包含的對象。
函數執行
在函數執行過程當中,每遇到一個變量,都會檢索從哪裏獲取和存儲數據,該過程從做用域鏈頭部,也就是從活
動對象開始搜索,查找同名的標識符,若是找到了就使用這個標識符對應的變量,若是沒有則繼續搜索做用域
鏈中的下一個對象,若是搜索完全部對象都未找到,則認爲該標識符未定義,函數執行過程當中,每一個標識符都
要經歷這樣的搜索過程。
建立做用域鏈的過程
函數進入全局,建立VO對象,綁定x屬性<入棧> global.VO={x=underfind; foo:reference of function}(這裏只是預解析,爲AO對象綁定聲明的屬性,函數執行時纔會執行賦值語句,因此值是underfind) 遇到foo函數,建立foo.AO,綁定y屬性<入棧> foo.AO={y=underfind, bar:reference of function} 遇到bar函數,建立bar.AO,綁定z屬性<入棧> bar.AO={z:underfind} 做用域鏈和執行上下文都會保存在堆棧中,因此: bar函數的scope chain爲:[0]bar.AO-->[1]foo.AO-->[2]global.VO foo函數的scope chain爲:[0]foo.AO-->[1]global.Vo //建議:少定義全局變量 //理由:由於做用域鏈是棧的結構,全局變量在棧底,每次訪問全局變量都會遍歷一次棧,//這樣會影響效率
函數的scope等於自身的AO對象加上父級的scope,也能夠理解爲一個函數的做用域等於自身活動對象加上父級做用域.
函數執行先後的做用域鏈:
注意:做用域鏈的非本身部分在函數對象被創建(函數聲明、函數表達式)的時候創建,而不須要等到執行
for (var i=1; i<=9; i++) { setTimeout( function timer(){ console.log( i ); },1000 ); } //================== for (var i=1; i<=9; i++) { (function(){ var j = i; setTimeout( function timer(){ console.log( j ); }, 1000 ); })();
BOM(瀏覽器對象模型),能夠對瀏覽器窗口進行訪問和操做。使用 BOM,開發者能夠移動窗口、改變狀態欄中的文本以及執行其餘與頁面內容不直接相關的動做。
使 JavaScript 有能力與瀏覽器「對話」。
window對象即瀏覽器的窗口對象。全部瀏覽器都支持 window 對象。
概念上講.一個html文檔對應一個window對象.
功能上講: 控制瀏覽器窗口的.
使用上講: window對象不須要建立對象,直接使用便可.
windows對象經常使用方法
1 alert() 顯示帶有一段消息和一個確認按鈕的警告框。 2 confirm() 顯示帶有一段消息以及確認按鈕和取消按鈕的對話框。 3 prompt() 顯示可提示用戶輸入的對話框。 4 5 open() 打開一個新的瀏覽器窗口或查找一個已命名的窗口。 6 close() 關閉瀏覽器窗口。 7 8 setInterval() 按照指定的週期(以毫秒計)來調用函數或計算表達式。 9 clearInterval() 取消由 setInterval() 設置的 timeout。 10 11 setTimeout() 在指定的毫秒數後調用函數或計算表達式。 12 clearTimeout() 取消由 setTimeout() 方法設置的 timeout。 13 14 scrollTo() 把內容滾動到指定的座標。
方法詳解
1 <script> 2 //----------alert confirm prompt---------------------------- 3 //window是全局變量,下面兩種alert方式等效 4 window.alert('cheer up'); 5 alert('go on'); 6 7 res= confirm('確認刪除嗎?'); 8 console.log(res); 9 10 //prompt 參數1 : 提示信息. 參數2:輸入框的默認值[可選]. 返回值是用戶輸入的內容. 11 pwd = prompt('請輸入卡密', '123'); 12 console.log(pwd); 13 14 //----------open close---------------------- 15 //open方法 打開和一個新的窗口 並 進入指定網址.參數1 : 網址. 16 //參數1 什麼都不填 就是打開一個新窗口. 17 open('http://www.baidu.com'); 18 // 參數2.填入新窗口的名字(通常能夠不填). 參數3: 新打開窗口的參數. 19 win = open('http://www.baidu.com','新窗口的名字','width=500,resizable=no,height=300'); 20 //close方法用於關閉窗口. 21 win.close(); 22 23 </script>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <style> 6 #in1{ 7 width: 200px; 8 height: 100px; 9 } 10 </style> 11 <title>DOM練習</title> 12 <input type="text" id="in1" onclick="show_time()"> 13 <button onclick="quit_time()">中止</button> 14 </head> 15 <body> 16 17 18 <script> 19 function set_time() { 20 var now_time = new Date().toLocaleString() 21 ele = document.getElementById('in1') 22 ele.value=now_time 23 } 24 25 var time_int 26 27 function show_time() { 28 if(time_int==undefined){ 29 set_time() 30 time_int = setInterval(set_time, 1000) //每1000ms執行一次set_time() 31 } 32 } 33 34 function quit_time() { 35 clearInterval(time_int) 36 time_int = undefined 37 } 38 39 </script> 40 </body> 41 </html>
History 對象包含用戶(在瀏覽器窗口中)訪問過的 URL。
History 對象是 window 對象的一部分,可經過 window.history 屬性對其進行訪問。
length 返回瀏覽器歷史列表中的 URL 數量。
經常使用方法
back() 加載 history 列表中的前一個 URL。 forward() 加載 history 列表中的下一個 URL。 go() 加載 history 列表中的某個具體頁面。 go(1)等效於forward() go(-1)等效於back()
<a href="rrr.html">click</a> <button onclick=" history.forward()">>>></button> <button onclick="history.back()">back</button> <button onclick="history.go()">back</button>
Location 對象包含有關當前 URL 的信息。
Location 對象是 Window 對象的一個部分,可經過 window.location 屬性來訪問。
location.assign(URL) location.reload() location.replace(newURL)//注意與assign的區別 //reload()執行後還能夠訪問reload以前的網頁, //replace()執行後不能夠訪問replace以前的網頁
DOM 是 W3C(萬維網聯盟)的標準。DOM 定義了訪問 HTML 和 XML 文檔的標準:
"W3C 文檔對象模型(DOM)是中立於平臺和語言的接口,它容許程序和腳本動態地訪問和更新文檔的內容、結構和樣式。"
W3C DOM 標準被分爲 3 個不一樣的部分:
根據 W3C 的 HTML DOM 標準,HTML 文檔中的全部內容都是節點(NODE):
節點(自身)屬性:
導航屬性:
<div id="div1"> <div id="div2"></div> <p>hello yuan</p> </div> <script> var div=document.getElementById("div2"); console.log(div.nextSibling.nodeName); //思考:爲何不是P? //nextSibling和nextElementtSibling的區別 </script>
parentElement // 父節點標籤元素
children // 全部子標籤
firstElementChild // 第一個子標籤元素
lastElementChild // 最後一個子標籤元素
nextElementtSibling // 下一個兄弟標籤元素
previousElementSibling // 上一個兄弟標籤元素
訪問 HTML 元素(節點),訪問 HTML 元素等同於訪問節點,咱們可以以不一樣的方式來訪問 HTML 元素:
頁面查找:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <div class="div1"> 9 <p id="p1">hello</p> 10 <div class="div2" name="mydiv2">div2</div> 11 </div> 12 <script> 13 14 //獲取節點的方式 15 // var ele = document.getElementsByTagName('p') 16 // var ele = document.getElementsByClassName('div2') 17 // var ele = document.getElementById('p1') 18 var ele = document.getElementsByName('mydiv2') 19 console.log(ele) 20 21 </script> 22 23 </body> 24 </html>
局部查找:
<div id="div1"> <div class="div2">i am div2</div> <div name="yuan">i am div2</div> <div id="div3">i am div2</div> <p>hello p</p> </div> <script> var div1=document.getElementById("div1"); ////支持; // var ele= div1.getElementsByTagName("p"); // alert(ele.length); ////支持 // var ele2=div1.getElementsByClassName("div2"); // alert(ele2.length); ////不支持 // var ele3=div1.getElementById("div3"); // alert(ele3.length); ////不支持 // var ele4=div1.getElementsByName("yuan"); // alert(ele4.length) </script>
HTML 4.0 的新特性之一是有能力使 HTML 事件觸發瀏覽器中的動做(action),好比當用戶點擊某個 HTML 元素時啓動一段 JavaScript。下面是一個屬性列表,這些屬性可插入 HTML 標籤來定義事件動做。
onclick 當用戶點擊某個對象時調用的事件句柄。
ondblclick 當用戶雙擊某個對象時調用的事件句柄。
onfocus 元素得到焦點。 //練習:輸入框
onblur 元素失去焦點。 應用場景:用於表單驗證,用戶離開某個輸入框時,表明已經輸入完了,咱們能夠對它進行驗證.
onchange 域的內容被改變。 應用場景:一般用於表單元素,當元素內容被改變時觸發.(三級聯動)
onkeydown 某個鍵盤按鍵被按下。 應用場景: 當用戶在最後一個輸入框按下回車按鍵時,表單提交.
onkeypress 某個鍵盤按鍵被按下並鬆開。
onkeyup 某個鍵盤按鍵被鬆開。
onload 一張頁面或一幅圖像完成加載。
onmousedown 鼠標按鈕被按下。
onmousemove 鼠標被移動。
onmouseout 鼠標從某元素移開。
onmouseover 鼠標移到某元素之上。
onmouseleave 鼠標從元素離開
onselect 文本被選中。
onsubmit 確認按鈕被點擊。
爲元素附加事件屬性的方式
<div onclick="alert(123)">點我呀</div> <p id="abc">試一試!</p> <script> var ele=document.getElementById("abc"); ele.onclick=function(){ alert("hi"); }; </script>
<div id="abc" onclick="func1(this)">事件綁定方式1</div> <div id="id123">事件綁定方式2</div> <script> function func1(self){ console.log(self.id) } //jquery下是$(self), 這種方式this參數必須填寫; //------------------------------------------ var ele=document.getElementById("id123").onclick=function(){ console.log(this.id); //jquery下是$(this), 這種方式不須要this參數; } </script>
onload:
onload 屬性開發中 只給 body元素加.
這個屬性的觸發 標誌着 頁面內容被加載完成.
應用場景: 當有些事情咱們但願頁面加載完馬上執行,那麼可使用該事件屬性.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script> // window.onload=function(){ // var ele=document.getElementById("ppp"); // ele.onclick=function(){ // alert(123) // }; // }; function fun1() { var ele=document.getElementById("ppp"); ele.onclick=function(){ alert(123) }; } </script> </head> <body onload="fun1()"> <p id="ppp">hello p</p> </body> </html>
onsubmit:
是當表單在提交時觸發. 該屬性也只能給form元素使用.應用場景: 在表單提交前驗證用戶輸入是否正確.若是驗證失敗.在該方法中咱們應該阻止表單的提交.
<form id="form"> <input type="text"/> <input type="submit" value="點我!" /> </form> <script type="text/javascript"> //阻止表單提交方式1(). //onsubmit 命名的事件函數,能夠接受返回值. 其中返回false表示攔截表單提交.其餘爲放行. var ele=document.getElementById("form"); ele.onsubmit=function(event) { // alert("驗證失敗 表單不會提交!"); // return false; // 阻止表單提交方式2 event.preventDefault(); ==>通知瀏覽器不要執行與事件關聯的默認動做。 alert("驗證失敗 表單不會提交!"); event.preventDefault(); }
Event 對象
Event 對象表明事件的狀態,好比事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。
事件一般與函數結合使用,函數不會在事件發生前被執行!event對象在事件發生時系統已經建立好了,而且會在事件函數被調用時傳給事件函數.咱們得到僅僅須要接收一下便可.
好比onkeydown,咱們想知道哪一個鍵被按下了,須要問下event對象的屬性,這裏就是KeyCode;
事件傳播
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <div id="outer" style="width: 200px; height: 200px; background-color: aqua"> 9 <div id="inner" style="width: 100px; height: 100px; background-color:fuchsia"></div> 10 </div> 11 12 </body> 13 <script> 14 document.getElementById('outer').onclick=function () { 15 alert('outer') 16 } 17 document.getElementById('inner').onclick=function () { 18 alert('inner') 19 event.stopPropagation()//阻止事件向外層div傳播. 20 } 21 </script> 22 </html>
增:
createElement(name)建立元素
appendChild();將元素添加
刪:
得到要刪除的元素
得到它的父元素
使用removeChild()方法刪除
改:
第一種方式:
replaceChild();
使用上面增和刪結合完成修改
第二種方式:
使用setAttribute();方法修改屬性
使用innerHTML屬性修改元素的內容
查
改變元素內容的最簡答的方法是使用 innerHTML ,innerText。
<p id="p2">Hello world!</p> document.getElementById("p2").style.color="blue";<br> .style.fontSize=48px
elementNode.setAttribute(name,value)
elementNode.getAttribute(name)<-------------->elementNode.value(DHTML)
createElement(name)
elementNode.removeChild(node)
elementNode.className
elementNode.classList.add
elementNode.classList.remove
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>輸入框</title> 6 </head> 7 <body> 8 <input type="text" id='userName'value="請輸入用戶名" onfocus="Focus()" onblur="Blur()"> 9 <script> 10 function Focus() { 11 ele = document.getElementById('userName'); 12 if (ele.value=='請輸入用戶名'){ 13 ele.value=""; 14 } 15 } 16 function Blur() { 17 ele = document.getElementById('userName'); 18 if (!ele.value.trim()){ 19 ele.value='請輸入用戶名'; 20 } 21 } 22 </script> 23 24 </body> 25 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>模態對話框</title> 6 <style> 7 .div1{ 8 width: 200px; 9 height: 200px; 10 background-color: fuchsia; 11 } 12 .div2{ 13 width: 200px; 14 height: 200px; 15 background-color:red; 16 } 17 .load{ 18 width: 200px; 19 height: 200px; 20 background-color:#bfa; 21 position: absolute ; 22 top: 67.5px; 23 left: 584.4px; 24 z-index: 666; 25 } 26 .shadow{ 27 width: 100%; 28 height: 100%; 29 top: 0px; 30 right: 0px; 31 left: 0px; 32 right: 0px; 33 position: fixed; 34 background-color: black; 35 opacity: 0.3; 36 z-index: 665 37 } 38 .hide{ 39 display:none ; 40 } 41 </style> 42 </head> 43 <body> 44 <button onclick="active_hide()">登陸</button> 45 <div class="shadow hide"></div> 46 <div class="div1">dvi1</div> 47 <div class="div2">div2</div> 48 <div class="load hide">登陸框 49 <button onclick="cancel_load()">取消登陸</button> 50 </div> 51 <script> 52 function active_hide(){ 53 eles = document.getElementsByClassName('shadow')[0] 54 eles.classList.remove('hide') 55 ele2 = document.getElementsByClassName('load')[0] 56 ele2.classList.remove('hide') 57 58 } 59 function cancel_load() { 60 eles = document.getElementsByClassName('shadow')[0] 61 eles.classList.add('hide') 62 ele2 = document.getElementsByClassName('load')[0] 63 ele2.classList.add('hide') 64 } 65 </script> 66 67 </body> 68 </html>
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>全選反選取消</title> 6 </head> 7 <body> 8 <form> 9 <input type="checkbox" >睡覺 10 <input type="checkbox">吃飯 11 <input type="checkbox">學習 12 </form> 13 </br> 14 <button onclick="select('all')">全選</button> 15 <button onclick="select('reve')">反選</button> 16 <button onclick="select('cancel')">取消</button> 17 18 </body> 19 <script> 20 21 function select(choice) { 22 var checkboxs = document.getElementsByTagName('input'); 23 for (var i = 0; i < checkboxs.length; i = i + 1) { 24 var checkbox = checkboxs[i]; 25 console.log(checkbox); 26 if (choice == 'all') { 27 checkbox.checked = true 28 } else if (choice == 'reve') { 29 checkbox.checked = !checkbox.checked 30 } else if (choice = 'cancel') { 31 checkbox.checked = false 32 } 33 } 34 } 35 </script> 36 </html>
//console.log(this.selectedIndex)//能夠獲取選中的列表項索引
//console.log(this.options)//能夠獲取列表框的列表項
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>兩級聯動</title> 6 </head> 7 <body> 8 <select id="province" > 9 <option>請選擇省份</option> 10 </select> 11 12 <select id="city"> 13 <option>請選擇城市</option> 14 </select> 15 16 <script> 17 data = {"福建省":['福州','莆田','廈門',], 18 "廣東省":['廣州','東莞',], 19 "浙江省":["嘉興"],}; 20 21 var ps = document.getElementById('province'); 22 var cs = document.getElementById('city'); 23 24 for (i in data){ 25 var ele = document.createElement('option'); 26 ele.innerHTML = i; 27 ps.appendChild(ele); 28 } 29 30 ps.onchange=function () { 31 cs.length = 0 32 //console.log(this.selectedIndex)//能夠獲取選中的列表項索引 33 //console.log(this.options)//能夠獲取列表框的列表項 34 var p = this.options[this.selectedIndex].innerHTML; 35 var citys = data[p]; 36 for (var i=0; i<citys.length; i++){ 37 var ele = document.createElement('option'); 38 ele.innerHTML = citys[i]; 39 cs.appendChild(ele) 40 } 41 } 42 </script> 43 44 </body> 45 46 </html>