title: JS學習筆記-從條件判斷語句到對象創建 date: 2016-04-28 21:31:13 tags: [javascript,front-end] JS學習筆記——整理自《JavaScript高級程式設計》 1)條件的判定 在if,swtich條件判斷語句,do-while,whil ...
---
title: JS學習筆記-從條件判斷語句到對象創建
date: 2016-04-28 21:31:13
tags: [javascript,front-end]
---
JS學習筆記——整理自《JavaScript高級程式設計》
1)條件的判定
在if,swtich條件判斷語句,do-while,while,for三種迴圈判斷語句中會用到條件的判斷,其目的是為了判定某種條件的達成與否來控制語句的執行。
e.g.
1 if(condition) 2 3 do{} while(condition) 4 5 for(initialization;condition;post-loop-expression){} 6 7 switch(expression){ 8 case condition: 9 break; 10 default: 11 break; 12 }
以上例子中的condition就是條件的判斷的語句。condition語句可以是任意表達式,ES會自動將表達式的結果轉為布爾值。
另外,switch的expression如寫成true,可以在之後的condition中寫入表達式,以此可以模仿if的判斷行為。
s.e.g.
1 switch(true){ 2 case (i>0): 3 i++; 4 }
2)迴圈
一.do-while語句是一種後測試迴圈語句,迴圈體內的代碼至少會迴圈一次。
e.g.
1 var I =0; 2 do { 3 i+2; 4 }while(i<10);
二.While語句是前測試迴圈語句,迴圈體的代碼可能一次也不會執行。
e.g.
1 var I = 0; 2 while (i <10) { 3 i+2; 4 }
三.for語句也是前測試迴圈語句,但是它具備while所沒有的初始化變數和定義迴圈後要執行代碼的能力。for 和 while 的迴圈功能是一樣的,while 做不到for也做不到。
e.g.
1 var count=10; 2 for(var i=0;i<count;i++){ 3 alert(i); 4 i++; 5 }
四.for-in 語句用來迴圈枚舉對象的屬性。迴圈會持續到對象的所有屬性都被枚舉一遍為止。單次迴圈時會將枚舉到的一個屬性名賦予in前的變數。
e.g.
1 for (var proName in window) { 2 document.write(propName); 3 }
3)數組
Array是數據的有序列表,數組的每一項可以保存任意類型的數據,而且數組的長度可以隨時變化。
創建數組的方法:
1.使用Array 構造函數:
var colors = new Array(20);
聲明瞭一個擁有20長度的colors數組。
var colors = new Array(“red”,”blue”,”green”);
聲明瞭一個擁有3長度的colors數組,並把三個顏色值寫入了數組的前三項。
2.使用數組字面量:
var colors = [“red”,”blue”,”green”];
聲明瞭一個擁有3長度的colors數組,並把三個顏色值寫入了數組的前三項。
各種屬性值與方法:
.length屬性可寫入。
instance of Array 可判斷對象是否是數組。ES5之後的版本可用.is Array()判斷對象是否是數組。
.toString(),toLocalString() 會返回逗號分隔的字元串,其中toLocalString()對每一項數值調用的是toLocalString()方法。
.valueOf() 返回的是數組。
.join()方法可以通過傳遞的指定的字元來分隔原數組,返回的是分隔後的字元串。
棧方法:
後進先出。
.push()接受任意數量的參數,逐個添加到數組末尾,返回的是修改後數組的長度。
.pop()不接受參數,每次調用pop()都會移除數組的最後一項並作為pop()的值返回。
隊列方法:
先進先出。
.shift()移除數組的第一項,並作為值返回,與pop()對應。
.unshift()在數組開頭添加任意項,並返回修改後的數組長度,與push()相對應。
重排序方法:
.sort():
能將數組內的各項按順序重新排序,預設為按照ASCII碼進行升序排序。
能接受一個比較函數作為參數,比較函數內的兩個參數進行比較:
e.g.
1 function compare(value1,value2){ 2 if (value1 < value2){ 3 return 1; 4 }else if (value1 > value2){ 5 Return -1; 6 }else{ 7 Return 0; 8 } 9 }
用這個比較函數返回給.sort()的話,數組會按照數值的從小到大進行排序,將上述的return值互調的話,數組會按照數值的從大到小排序。
.reverse():將數組所有項的順序取反並返回取反後的數組。
操作方法
.concat():將接受的參數連接在原數組的後面。如果接受的參數是一個數組,將會把數組中的每一項提取後單獨加入到原數組中。
.slice():接受一到兩個參數,創建一個新的數組,包含從第一個參數為止到第二個參數為止的所有數據項,不包含第二個參數位置的項。如果沒有第二個參數,則執行到數組最末尾。
.splice():拼接方法,第一個參數表示起始位置,第二個參數表示要刪除的數組項數,之後的參數表示要從第一個參數的位置開始要插入的數據。通過第一第二個參數的變化,可以模擬push,pop,shift,unshift的四種方法達到同樣的效果,本身的意義在於在數組中插入數據。
位置方法
.indexOf():查找指定的項,第一個參數表示要查找的數據項,第二個參數表示要開始查詢的位置。lastIndexOf()則是從數組的後面開始。
##4)函數
聲明式:
function functionName(){ };
表達式:
var functionName = function(){ }
聲明式會提升該段代碼的優先順序,解析器會在所有代碼之前讀取函數聲明。
表達式不會提升優先順序,函數名只是指向函數的指針,將函數名賦予一個變數只是賦予了引用類型。
JS中函數沒有重載的概念,後定義的函數會覆蓋之前的函數。
arguments指代了函數的所有參數,是一個數組,arguments.callee方法指向arguments的調用函數。
.caller方法指向了調用當前函數的函數。
.apply() 和.call()兩個方法的作用是讓函數在特定的作用域中調用函數。
this指代了當前執行環境的主體。
##5)對象
ES中的對象就是一組數據和功能的集合,創建Object類型的實例並給它添加屬性和方法,就可以自定義對象。
除Object外,Array,Date,RegExp,Function,Boolean,Number,String,Global,Math等這些也都是對象。
創建Object的兩鐘基礎方法:
e.g.
var person = new Object(); Person.name = “Peter”;
這種方法是使用new操作符加Object構造函數。
對象字面量:
e.g.
Var person = { Name : ”Peter”, Age:29; };
使用對象字面量法定義對象,不會調用Object的構造函數,更常使用。
為瞭解決使用同一個介面創建很多對象,產生大量重覆代碼的問題,出現了後面幾種創建對象的方法:
·工廠模式
1 function createPerson(name,age,job){ 2 var o =new Object(); 3 o.name = name; 4 o.age = age; 5 o.job = job; 6 o.sayName = function(){ 7 alert(this.name); 8 }; 9 return o; 10 }
解決了創建多個相似對象的問題,但沒有解決對象識別的問題。
·構造函數模式
1 function createPerson(name,age,job){ 2 this.name = name; 3 this.age = age; 4 this.job = job; 5 this.sayName = function(){ 6 alert(this.name); 7 }; 8 }
構造函數模式可以將它的實例識別為一種特定的類型,解決了對象識別的問題。但是每個方法都要在每個實例上重新創建一邊。
·原型模式
通過調用每個函數都有的prototype原型屬性來創建共用屬性和方法的實例。
1 function Person(){ 2 } 3 Person.prototype.name ="Peter"; 4 Person.prototype.age = 20; 5 Person.prototype.sayName =function(){ 6 alert(this.name); 7 } 8 9 var person1 = new Person();
原型模式下,實例中創建的屬性會屏蔽原型中的屬性,而對原型對象所做的任何修改都能立即從實例上反應出來。
·組合使用構造函數和原型模式
1 function Person(name,age){ 2 this.name =name; 3 this.age = age; 4 } 5 Person.prototype = { 6 constructor:Person, 7 sayName : function(){ 8 alert(this.name); 9 } 10 } 11 12 var person1 = new Person("Peter",20);
實例屬性在構造函數中定義,實例共用的屬性和方法在原型中定義,這種方法可能最適合。