javascript
javascript引用类型
引用類型常被稱為 “類”,但是這在JavaScript中不太合適。它是屬性和方法的集合。
引用類型的值"對象"是引用類型的實例。
特殊的標識符和運算符
| ?符號 | 類型 | 執行操作 |
| () | 函數 | 函數調用 |
| new | 構造函數調用 | 創建新對象 |
?
?
new 運算符用來創建一個新對象,并調用構造函數初始化它,new 是一個一元運算符,出現在構造函數的調用之前。
在?JavaScript 中運算符 () 用于調用函數,這是一個特殊的運算符,因為它沒有固定數目的運算數
var a1 = asdf(new);? // 表示調用 asdf函數,并將返回結果 賦給 a1
var a2 = function(new){ return new } ;?? // 表示將函數賦給 a2 , 如果要調用該函數就要使用 a2(new)
Object類型
我們看到大多數引用類型值都是Object類型的實例,創建方法如下:
1) var person = new Object(); person.name = “nihao”; person.age = 29;
2) var person = { name : “nihao”, age : 29 };??? //字面量表示法,使用的人多一點。傳遞參數時,當參數是可變時,一般采用這種方法
在通過對象字面量定義對象時, 實際上不會調用 Object 構造函數.
雖然可以使用前面介紹兩種方法中任何一種定義對象, 但是開發人員比較青睞對象字面量方法, 因為這種語法要求的代碼量少, 而且能夠給人封裝的感覺, 實際上, 對象字面量也是向函數傳遞大量可選參數的首選方式. 例如:
function displayInfo(args) {
? var output = "" ;
? if (typeof args.name?== "string") {
??? output += "Name: " + args.name + "\n";
? }
? if (typeof args.age == "number") {
??? output += "Age: " + args.age + "\n";
? }
}
displayInfo ({
? name : "Nicholas",
? age : 29
});
displayInfo ({
? name : "Greg"
});
這種傳遞參數的模式最適合需要向函數傳入大量可選參數的情形,一般來講, 明明參數雖然容易處理, 但在有多個可選參數的情況下就會顯示不夠靈活, 最好的做法是對那些必須值使用命名參數, 而使用對象字面量來封裝多個可選參數.
對于對象的屬性, 既可以使用. 來訪問, 也可以使用 [] 來使用.
alert(person["name"]);? // "Nicholas"
alert(person.name);????? // "Nicholas"
但是還是建議使用 . 表示法
?
Array類型
- 創建方法 1) var colors = new Array(20) ; //20可選?? 也可以 var colors = new Array(“red”,”blue”,”green”);? 2)字面量表示法: var colors = [“red”,”blue”,”green”] ;???????? var colors = [] ;(個人喜歡這種方法,跟以前C一樣)
- 數組下標從 0 開始。另外具備 length屬性,colors.length . 增加length情況? var colors = [“red”,”blue”,”greed”] ; colors.length = 4 ; 此處增加了length的長度,alert( colors[3] ) ; 返回 undefined .? 增加顏色 colors[colors.length] = “black”;( 利用 length 可以方便的在數組末尾添加新項目 )
- 轉換方法 上例,colors.toString()? // 返回結果是 red,blue,green 用逗號分隔,valueOf()一樣,使用 join方法可以用不同符號連接,例如 var colors = [ “red”,”green”,”blue”]; alert( colors.join("||") ) ;???? 返回 red||green||blue , 還有一個調用方法 toLocalString(),這個方法有的時候會調用數組內部每個元素的自己的toLocalString方法。
例如:
var person1 = {
? toLocaleString : function() {
??? return "Nicho";
? },
? toString : function() {
??? return "Nicho";
? }
};
var person2 = {
? toLocaleString : function() {
??? return "Grigorios";
? },
? toString : function() {
??? return : "Greg";
? };
}
var people = [person1, person2];
alert(people);?? // Nicho, Greg
alert(people.toString());? // Nicho,Greg? , 注意這調用的是數組 people 自身的 toString 方法
alert(people.toLocaleString());? // Nicho, Grigorios?
- 棧方法 : 棧是一種常用的數據結構,用數組實現。 var colors = new Array() ;?? var count = colors.push(“red”,”green”) ; alert( count ); count = colors.push(“black”);? var item =? colors.pop() ;?
- 隊列方法 : 也是一種常用的數據結構,用數組實現。var colors = new Array();? var count = colors.push(“red”,”green”) ; alert(count ); count = colors.push(“black”); alert(count);??? var item = colors.shift() ; //取出第一個元素,即 “red”另外,unshift()方法,與shift()方法相反,它能在數組前端添加任意個項并返回叔祖長度,同時使用 unshift()和pop()方法,可以從相反方向來模擬隊列,
- 重排序方法 : sort() 和 reverse()? sort 比較時,會將數組的每一項目調用它自己的toString()方法,使其成為字符串再進行對比,這樣,就會有個問題,如例子 var values = [0,1,5,10,15] ; values.sort(); alert(values) ;???? //返回 0,1,10,15,5?? 并非按照數字的內容進行排列,而是按照字符串的內容進行排列。由此,要加入比較函數 value.sort( compare ) ; -->這樣就返回正確的值了, sort 函數所接收的參數是函數
?
Array.isArray(value) , 判斷value對象到底是不是數組, 如果是就會返回true, ie9+ 等最新瀏覽器支持.
-
操作方法 concat() 連接方法? var colors = [“red”,”green”];? var colors2 = colors.concat(“yellow”,[“black”,”brown”]) ;? alert(colors) ;?? // red,green,blue??? alert(colors2);???? //red,green,blue,yellow,black,brown?? slice()方法,用于根據已經存在的數組,按照想要的位置創建數組,例如 var colors = [“red”,”blue”,”green”,”yellow”];?? var colors2 = colors.slice(1); var colors3 = colors.slice( 1,3 ) ; 只有1個參數時,表示從該參數位置開始到最后,如果有2個參數則表示從第一個參數開始,到第2個參數為止,alert(colors2 ) //返回 blue,green,yellow alert( colors3) ;? //返回 blue,green,yellow??? splice()方法 多種用法,主要用途是向數組中插入項,刪除- splice( 0,2 ) 其中0是刪除啟始位置,2表示刪除個數。(返回的是被刪除元素的數組)?插入-splice(2,0,”red”,”green”)其中2表示插入位置,0表示要刪除的項數,后邊的是插入的內容? 替換-splice(2,1,”red”,”green”)其中2是插入位置,1是刪除項數,后邊的是插入內容,其實替換和刪除格式相同,只是,刪除時,第2項 即刪除項數應該為 0 ??梢钥闯? splice 的第一個參數是啟始位置, 第2個參數是要刪除的項的個數, 后面接的是插入的數據.
- ECMAScript 5 為數組實例增加了兩個位置方法, indexOf() 和 lastIndexOf(), 這兩個方法都接收兩個參數, 要查找的項和(可選的)表示查找起點位置的索引.其中 indexOf方法從數組頭開始, lastIndexOf 方法從數組尾開始查找. 如果找到, 返回找到的索引位置, 如果沒找到, 返回 -1, 另外在測試比較時, 會使用全等===, 來進行, 例如
var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
alert(numbers.indexOf(4));?? // 返回結果是3, 可見還是從下標 0 開始
alert(numbers.lastIndexOf(4));? // 返回結果是5, 從后邊開始查找, 但是對應的下標還是正序的.
alert(numbers.indexOf(4, 4));?? // 找 "4" , 并且從第?4 項 開始查找. 返回結果是 5. ( 所有的地方, 記住下標從 0 開始, 統一標準 )
- 迭代方法( ECMAScript 5 )
every(); 對數組的每一項都運行給定函數, 如果每一項都返回true, 則返回true (all 的關系, 數組中每個值, 即所有的 運行該函數都要返回true)
filter(); 對數組的每一項都運行給定函數, 返回 該函數返回 true 的數組項 組成新的數組( 注意, 這是原數組項組成一個新的數組 )
forEarch(); 對數組的每一項都運行給定函數, 沒有返回結果
map(); 對數組的每一項都運行給定函數, 每次調用函數的結果組成一個數組. (執行函數的結果, 會組成一個數組)
some(); 對數組的每一項都運行給定函數,?只要有一項執行函數后返回位 true, 那么就返回為 true.
例如:
var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var everyResult = numbers.every(function(item, index, array) {
? return (item > 2);
}) ;
alert(everyResult);? // false
?
var someResult = numbers.some(function(item, index, array) {
? return(item > 2);
});
alert(someResult)? // true
var filterResult = numbers.filter(function(item, index, array) {
? return (item > 2);
});
alert(filterResult);? // [3, 4, 5, 4, 3]
var mapResult = numbers.map(function(item, index, array) {
? return (item * 2);
});
alert(mapResult);?? // [2, 4, 6, 8, 10, 8, 6, 4, 2]
可見, 參數是一樣的, item, index, array...
- 縮小方法( ECMAScript 5 )
reduce(), reduceRight(), 都會迭代處理數組所有項, 一個從前開始, 一個從后開始, 會接收 4 個參數, 當前值, 下一個值, 項的索引, 數組對象, 例如:
var values = [1, 2, 3, 4, 5];
var sum = values.reduce(function(prev, cur, index, array) {
? return prev + cur;
});
alert(sum);? // 15
var sum = values.reduceRight(function(prev, cur, index, array) {
? return prev + cur;
});
alert(sum);? // 15
可以看到, 函數運行后, 數組項沒有發生改變, 只不過可以通過這種辦法來對數組的每一項進行迭代, 同時, 可以利用當前項 和 后一項, 來參與某些計算.?
Date 類型
var now = new Date() ; 在調用Date構造函數時而不傳遞參數的情況下,新創建的對象自動獲得當前日期和時間。如果想根據特定的日期和時間創建日期對象,必須傳入該日期的毫秒數,所以就要調用2個方法,Date.parse() , date.UTC() ,? 其中Date.parse()接收字符串參數,例如 var someDate = new Date ( Date.parse(“May 25, 2004”)) ;? 如果此字符串不能被識別,則返回 NaN .? Date.UTC() 參數分別是 年,月(1月從0開始),日,小時,分鐘,秒,毫秒,其中只有前兩個參數是必須的。var allfives = new Date(Date.UTC(2005,4,5,17,55,55)) ;? //個人感覺這個好一點,Date類型是可以進行比較的,例如 var date1 = new Date( 2007, 0, 1 );??? var date2 = new Date( 2007, 1, 1) ; alert( date1 < date2 ) ; 返回 true, alert( date1 >date2); 返回 false.
- 日期格式化方法 toDateString() , toTimeString() toLocaleDateString() , toLocaleTimeString() , toUTCString()
還有很多別的日期的方法
?
RegExp類型 ( 正則表達式 ) ( 與 linux 一樣 )
var expression = / pattern / flags ;
其中 模式為 pattern , flags 標志 :
g 表示全局模式, 即模式將被應用于所有字符串, 而非在發現第一個匹配項時就立刻停止.
i 表示不區分大小寫, 即在確定匹配項時忽略模式與字符串的大小寫
m 表示多行模式, 即在到達一行文本末尾時還會繼續查找下一行中是否存在模式匹配的項.
例如 : var pattern2 = / [bc]at/i ; /* 不區分大小寫,匹配第一個 "bat" 或 "cat" */
需要轉義的字符 : ( [ { \ ^ $ | ) ? * + . ] }
View CodeRegExp 對象的主要方法是 exec (),該方法接受一個參數,即要應用模式的字符串。
var text = "mom and data and baby"
var pattern = / mom ( and dad ( and baby ) ? )? /gi ;
var matches = pattern.exec( text );
正則表達式是由字符串所組成的表達式,用于匹配和替換或者查找特定的字符串。( 多數編程語言都提供對正則表達式的支持 ).
主要用來確認字符串中, 是否可以捕獲到相應的正則表達式.
var searchPattern = new RegExp( 's+' ) ;???? // 第一種創建方法
var searchPattern = / s+ / ;????????????????????????????? // 第二種方法,這種常用
正則表達式的實例屬性 :
global: 表示表達式是否設置了 g 標志
ignoreCase: 表示標傲世是否設置了 i 標志
lastIndex: 整數, 表示開始搜索下一個匹配項的字符位置, 從0算起.
multiline: 表示是否設置了 m 表示
source: 按照字面量形式, 而非傳入構造函數中的字符串模式.
RegExp對象只有2種實例方法 : test 和? exec
例子 : var re = / JavaScript rules / ;
var str = "JavaScript rules" ;
if (re.test(str)) document.writeln("I guess it does rule") ;? //默認匹配是區分大小寫的
var expression = new RegExp("pattern", 'ig') ;?? // 等同于下面的定義
var expression = / pattern / flags ;? // parttern 是各種正則表達式 g- 全局, i- 不區分大小寫, m-多行,
pattern 可以包含許多符號 : ( [ { \ ^ $ | ) ? * + . ] }????????? \轉義字符
全局匹配是查找與正則表達式匹配的所有字符串,而忽略正則表達式的位置,如果不使用全局匹配選項g,那么只會返回第一個匹配項。
i : 不區分大小寫
m : 多行模式,即在到達一行文本末尾時,繼續查找下一行中是否存在與模式匹配的項。
var pattern1 = /at / g ;?? // 匹配字符串中所有 "at" 的實例
var pattern2 = / [bc]at/ i ; // 匹配第一個 "bat" 或 "cat" , 不區分大小寫???????? 等價定義 var pattern2 = new Regexp("[bc]at", "i" ); // 構造函數
var pattern3 = / .at/ gi ;?? //匹配全部以 .at結尾的字符, 不區分大小寫
正則表達式元素符號 : ( [ { \ ^ $ | ) ? * + . ] }???? \轉義字符?? 詳細如下 :
a | b : a 或 b ( 一樣Linux?)
s{2} : 大括號內表示出現次數, s出現2次 , s{2,4} 2-4 次數 ( 一樣Linux )
\s : 如果是一般字符, 例如 s , \s 表示特殊字符 ( 空格,制表符,換行符)
\+ : 如果是特殊字符 : 則就是 + 號
* : 表示出現0次或多次 ( 一樣Linux )
+ : 表示出現1次或多次
? : 表示出現0次或1次
. : 表示只出現1次? 除了換行符號之外任意字符 等價于 [ ^\n ] ( 一樣Linux )
^ : 非 例如 [ ^ 0-9 ] , var regExp = / ^The/im ;?? [^abc] 除了 abc 以外全部都ok , 即全部否定 ( 一樣Linux )
$ : 結尾 s$ 表示以s結尾的都有效 ( 一樣Linux )
[ ] : 字符類( 即中括號 )? / [abc] / 表示和字母 "a" , "b " , "c " 中的任何一個都匹配 . ( 一樣Linux )
( ) : 表示對模式進行分組
exec() : 該方法專門為捕獲組而設計的,exec()接受一個參數,即要應用模式的字符串,然后返回包含第一個匹配項信息的數組 ,或者在沒有匹配項的情況下返回 null,返回的數組雖然是 Array 的實例,但包含兩個額外的屬性 : index 和 input 其中,index 表示匹配項在字符串中的了位置,input表示應用正則表達式的字符串。返回的數組中,第一個元素會是完全匹配的內容,第2個元素則是匹配分組模式的內容。
?
方法
exec(string): 對string進行正則處理,并返回匹配結果.
exec方法返回的數組有3個屬性,分別是input、index和lastIndex. (lastIndex 不常用)
1 input 屬性是整個被搜索的字符串。
2 index屬性是指匹配在整個被搜索字符串中的位置。
test(string): 測試string是否含有匹配結果 ( 返回 boolean類型 )
Function類型
JavaScirpt中的 fucntion 是比較特殊的,因為它是一個真真正正存在的類型,也就是說可以通過定義變量來保存它,比如 : var tex = function( num){}, 此時的 text中保存的真的就是該函數,而如果想執行該函數,就需要 () 的幫助,即 tex() ;這樣表示執行該函數。
JavaScript中的 function 是對象, 每個函數都是 Function類型的實例, 而且都與其他引用類型一樣具有屬性和方法. 由于函數式對象, 因此函數名實際上也是一個指向函數對象的指針, 不會與某個函數綁定,
函數聲明和函數表達式的區別 : 1)函數聲明 function abc(num1,num2){} ;???? 2) 表達式 var tex = function(num1,num2){} ;? 其中函數聲明可以在被調用之后聲明,而函數表達式在使用時,是在解釋執行的時候,必須前邊要有該函數的定義。
由于函數名僅僅是指向函數的指針, 因此函數名與包含對象指針的其他變量沒有什么不同, 換句話說, 一個函數可能會有多個名字, 例如:
function sum(num1, num2) {
? return num1 + num2;
}
alert(sum(10, 10));? // 20
var anotherSum = sum;? // anotherSum 與 sum 一樣, 都是指向函數對象的一個指針.
alert(anotherSum(10, 10));? // 20
sum = null;? // 釋放了一個指針, 但是沒關系, 在堆內存中, 還有另外一個指針 anotherSum 連接著函數對象, 所以函數對象不會被釋放
alert(anotherSum(10, 10));? // 20
解析器會先讀取函數聲明,并使其在執行任何代碼之前可用,例如
所謂函數聲明, 就是指單獨的, javascript 在編譯的時候, javascript引擎會在第一遍聲明函數并將它們放到源代碼樹的頂部, 所以即便你的聲明部分在調用部分之后, 也沒關系, 因為編譯器已經將它挪到了頂部.
但是函數的表達式, 就是下邊的第2種則不行, 它只有到這條語句真正運行時才會被解析, 所以第 2 段代碼不能執行.
function abc() {
? // 函數體
}
1: //可以執行 2: alert( sum(10,10)) ; 3: function sum(num1, num2){ 4: return num1 + num2 ; 5: } 6: ? 7: // 不可以執行 8: alert( sum(10,10)) ; 9: var sum = function (num1, num2){ 10: return num1 + num2 ; 11: } ; //注意此處有個 ; 號沒有重載
因為函數名實際上是指針變量, 所以, 兩個指針變量不能有一樣的名字。要訪問函數的指針而不執行函數的話, 必須去掉函數名后面的那對圓括號.
作為值得函數, 因為在javascript中, 完全可以把一個函數當做是一個變量來看待, 以下例子就是講函數本身看成一個值, 注意, 這不要把函數的返回值混為一談, 而是把這個函數本身作為結果返回的結果.
1 /* 2 * 這個例子主要說明, 函數作為參數傳遞. 3 * 將 add10 函數本身傳遞給了 someFunction 4 */ 5 function callSomeFunction(someFunction, someArgument) { 6 return someFunction(someArgument); 7 } 8 9 function add10(num) { 10 return num + 10; 11 } 12 13 var result1 = callSomeFunction(add10, 10); 14 alert(result1); // 20 15 16 function getGreeting(name) { 17 return "Hello, " + name; 18 } 19 20 var result2 = callSomeFunction(getGreeting, "Nicholas"); 21 alert(result2); // "Hello, Nicholas"可以從一個函數中返回另一個函數, 而且這也是極為有用的一種技術. 例如, 假如有一個對象數組, 我們想要根據某個對象屬性對數組進行排序, 而傳遞給數組sort() 方法的比較函數要接收兩個參數, 即要比較的值, 可是, 我們需要一種方式來指明按照那個屬性來排序, 要解決這個問題, 可以定義一個函數, 它接收一個屬性名, 然后根據這個屬性名來創建一個比較函數, 例如下邊:
( 該函數返回的是一個函數,而不是內部函數執行的結果 )
1: function createComparisonFunction(propertyName){ 2: return function(object1, object2){ 3: var value1 = object1[propertyName]; 4: var value2 = object2[propertyName]; 5: if(value1 < value2){ 6: return -1; 7: }else if(value1 > value2){ 8: return 1; 9: }else{ 10: return 0; 11: } 12: }; 13: } 14: ? 15: var data = [{name:"zachary", age: 28}, {name: "nicholas", age:29}]; 16: data.sort(createComparisonFunction("name")); 17: alert(data[0].name); //nicholas 18: ? 19: data.sort(createComparisonFunction("age")); 20: alert(data[0].name); //zachary 21: ??以上例子, 首先, sort() 方法的參數是一個函數, 而 createComparisonFunction("name") 這個函數的調用本身就是返回一個函數, 而這個返回的函數正式sort()想要的, 所以, sort()的參數并不是想要 某個實際的值, 而是一個函數, 通過改變"name" 這個參數, 就可以根據對象的不同屬性值來定義 compare 函數, 即 sort 所需要的比較函數. 所以, 個人覺得不要想的太復雜, return function , 那么就把 function 當做一個值來看待, 返回的就是它, 至于 function 函數里邊是否有 return 都不需要關心.
函數內部屬性
- arguments : 它是一個類似于數組的對象, 包含傳入函數中的所有參數, 另外arguments還有個屬性callee, 該屬性是一個指針, 指向擁有arguments對象的函數,在遞歸調用時,十分有用。
function factorial(num) {
? if (num <= 1) {
??? return 1;
? } else {
??? return num * factorial(num - 1)
? }
}
如上, 遞歸函數定義是沒有問題, 但是遞歸函數內部與函數名僅僅耦合在一起, 這樣, 當你要改變函數名稱時, 或者 var aaa = factorial;?就需要同時修改多個地方, 所以看如下例子:
function factorial(num) {
? if (num <= 1) {
???? return 1;
? } else {
??? return num * arguments.callee(num - 1);
? }
}
- this : 引用的是函數拘以執行操作的對象-或者說 this是函數在執行時所處的作用域,例如當在網頁的全局作用域中調用函數時,this對象引用的就是window,所以this基本上就是指這個函數所屬的對象。
- caller, ECMAScript 5 中有, 保存調用當前函數的函數引用, 即保存著調用者, 這個函數本身是被調用者.
函數的屬性和方法
- length 表示函數希望接收的個數 ( 參數個數 ) ( 利用此內容可以在一個函數內執行不同的代碼 )
- propotype 保存它們所有實例方法的真正所在,換句話,類似 toString() 和 valueOf() 等方法實際上都保存在 prototype 名下,只不過通過各自對象的實例訪問罷了。這個 propotype 很耐人尋味, 貌似 javascript 有3大陣營, 1是類本身, 例如靜態變量, 靜態方法保存在這里, 2是propotype陣營, 這里指保存那些被所有實例所繼承的方法, 但是它是需要有實例的, 所以有區別于陣營1, 陣營1的訪問是通過類名的, 例如 Math.PI 等等, 3是 實例, 即那些通過類模板而創造出來的實例.
- apply() 接受2個參數,1是在其運行函數的作用域,另一個是參數數組 (arguments , 或Array實例 ) call 與 apply() 類似,只是參數 1是在其運行函數的作用域,其他的參數要一一列出。( 它們真正強大的地方是能夠擴充函數賴以運行的作用域 )
- call() 方法,call方法和apply()方法的作用相同,區別是接受參數方式不同,call()傳遞的參數必須逐個列舉出來。前邊的this都相同
基本包裝類型
Boolean, Number, String
一般都是自動包裝了.
String 類型
var s1 = "some text";
var s2 = s1.substring(2);
var stringValue = "Hello, world"
alert(stringValue.length); // 11
alert(stringValue.charAt(1)); // "e", 因為下標從 0 開始
alert(stringValue.charcodeAt(1)); // 輸出"101", 返回的是字符編碼, 貌似ASC|| 編碼
var result = stringValue.concat("world"); // 字符串操作, 連接, 也可以使用 + 號 來進行字符連接
var result = stringValue.concat("world", "!");?
另外還有 slice(), substr() 和 substring()
sbtstring(), slice(), 兩個參數, 起始位置和結束位置(標號)
substr(), 兩個參數, 起始位置和個數.
var stringValue = "hello world";
alert(stringValue.slice(3)); // "lo world", 如果不給定第2個參數, 這三個函數均表示截取字串到最后
alert(stringValue.substring(3)); // "lo world", 如果不給定第2個參數, 這三個函數均表示截取字串到最后
alert(stringValue.substr(3)); // "lo world", 如果不給定第2個參數, 這三個函數均表示截取字串到最后
alert(stringValue.slice(3, 7)); // "lo w", 如果不給定第2個參數, 這三個函數均表示截取字串到最后
alert(stringValue.substring(3, 7)); // "lo w", 如果不給定第2個參數, 這三個函數均表示截取字串到最后
alert(stringValue.substr(3, 7)); // "lo worl", 如果不給定第2個參數, 這三個函數均表示截取字串到最后
在傳遞給這些方法的參數是負值的情況下, 它們的行為就不盡相同了, 其中,
slice() 方法會將傳入的負值與字符串長度相加,
substr() 方法將負的第一個參數加上字符串的長度, 而將負的第而個參數轉換為0,
substring() 方法會將所有的負值參數轉換為0, 參照如下例子:
var stringValue = "hello world";
alert(stringValue.slice(-3)); //"rld", -3 + 11 = 8, 所以實際上相當于調用了 slice(8)
alert(stringValue.substr(-3)); //"rld", -3 + 11 = 8, 所以實際上相當于調用了 substr(8)
alert(stringValue.substring(-3)); //"hello world", 因為它會將負數轉換成 0, 所以實際上相當于調用了 substring(0)
alert(stringValue.slice(3, -4)); //"lo w",?第 2 個參數換傳喚成 7, -4 + 11 = 7, 所以實際相當于調用 slice(3, 7), 不包括第7個字符
alert(stringValue.substring(3, -4)); //"hel", 第 2 個參數換傳喚成 0,?所以實際相當于調用 substring(3, 0), 因為后邊的參數小于前邊的參數, 所以實際調用 substring(0, 3)
alert(stringValue.substr(3, -4)); //"", 第 2 個參數換傳喚成 0, 因為這個0是位數, 所以就相當于不截取子串, 所以返回的是空串.
字符串位置的方法
indexOf, lastIndexOf() 沒找到返回-1
alert(stringValue.indexOf("o")); // 4
alert(stringValue.lastIndexOf("o")) // 7
另外還可以加一個起始位置的參數,
trim() 方法, 刪除字符串前后的空格
toLowerCase(), toLocaleLowerCase()? // local 的內容是針對地區不一樣, 少數語言, 例如 土耳其語的轉換方法, 估計一般不用
toupperCase(), toLocalUpperCase()
?字符串的匹配方法
var text = "cat, bat, sat, fat";
var pattern = /.at/;
// 與 pattern.exec(text) 相同
var matches = text.match(pattern);
alert(matcher.index); // 0
alert(matches[0]); // "cat"
alert(pattern.lastIndex); // 0
還有一個 search, 用法基本相同
var text = "cat, bat, sat, fat";
var pos = text.search(/at/);
alert(pos); // 1, 如果沒有匹配的, 就會返回 -1
replace() 替換方法, 兩個參數, 后邊的參數是使用替換的內容, 前邊參數或者是個正則表達式, 或者是個字符串, 代表將要被替換的字串, 例如:
var text = "cat, bat, sat, fat";
var result = text.replace("at", "ond");
alert(result); // "cond, bat, sat, fat", 只替換第 1 個
result = text.replace(/at/g, "ond"); // g 表示全局, 即字符串里所有滿足要求的都要被替換.
alert(result); // "cond, bond, sond, fond"
?
Number 類型
var num = 10;
alert(num.toFixed(2)) // “10.01”, 確認兩位小數
?
顯示的基本包裝類型聲明
var obj = new Number(value);
不建議這樣使用(顯示的包裝類型)
?函數傳遞問題
當函數在進行 復制, 比較, 傳遞
| 類型 | 復制 | 傳遞 | 比較 |
| 數字 | 傳值 | 傳值 | 傳值 |
| 布爾 | 傳值 | 傳值 | 傳值 |
| 字符串 | 不可變 | 不可變 | 傳值 |
| 對象 | 傳址 | 傳址 | 傳址 |
?
內置對象 Global Math
開發人員不必顯示的實例化內置對象
- Global 是”兜底”的對象,所有的不屬于任何類的對象,都屬于 Global對象,事實上,沒有全局變量和全局函數,所有在全局作用域中定義的屬性和函數,都是Global對象的屬性。在瀏覽器環境下,作為 window 對象。window對象在瀏覽器中就扮演了 Global對象.
- Math對象,是數學對象,提供一些數學函數直接使用。如 Math.PI? Math.max方法等等
Math 的舍入方法: ceil() floor(), round()
ceil() 向上舍入為整數, 例如 25.9, 舍入后為 26
floor() 向下舍入為整數, 例如 25.9 舍入后為 25
round() 4舍5入為整數, 例如 25.9 為 26, 25.4 為 25
random() 總是生成 0~1之間的隨機數
?
CODE
1 function init() { 2 var i; 3 var ary = new Array(5); 4 for (i=0; i<ary.length; i++) { 5 ary[i] = i.toString(); 6 document.write(ary[i]); 7 } 8 // 棧 9 ary.push("5"); //push 10 document.write("<br />"); 11 document.write(ary.toString()); 12 ary.pop(); //pop 13 document.write("<br />"); 14 document.write(ary.join("||")); 15 document.write("<hr />"); 16 //隊列1 17 ary.push("6"); 18 document.write("<br />"); 19 document.write(ary.join("||")); 20 ary.shift(); 21 document.write("<br />"); 22 document.write(ary.join("||")); 23 //隊列1 24 ary.unshift("6"); 25 document.write("<br />"); 26 document.write(ary.join("||")); 27 ary.pop(); 28 document.write("<br />"); 29 document.write(ary.join("||")); 30 document.write("<hr />"); 31 // 排序 32 ary.sort(compare); //只給出函數名而并非執行該函數,如果是執行就是 compare(); 33 document.write("<br />"); 34 document.write(ary.join("||")); 35 document.write("<hr />"); 36 // 操作方法 37 // 1 concat ( 連接 ) 38 var ary2 = ary.concat("ss"); 39 document.write("<br />"); 40 document.write(ary2.join("||")); 41 // 2 slice ( 子數組 ) 42 var ary3 = ary.slice(1,3); // 這個只有2個元素,表示從1開始,到3之前就截止。 43 // 所以尾條件注意 + 1 44 document.write("<hr />"); 45 document.write(ary3.join("||")); 46 var ary4 = ary.slice(1); // 只有1個參數表示,從該參數開始,到最后,依然是0開始 47 document.write("<hr />"); 48 document.write(ary4.join("||")); 49 // 3 splice ( 任意編輯數組項,插入,刪除, 替換 ) 直接操作該數組 50 document.write("<hr />"); 51 document.write(ary.join("||")); 52 document.write("<hr />"); 53 ary.splice(0, 2); //刪除, 返回的是被刪除元素的數組 54 document.write(ary.join("||")); 55 ary.splice(0, 0, "a","b","c"); //插入, 直接修改數組內容,0 插入位置,0替換元素,插入元素 56 document.write("<hr />"); 57 document.write(ary.join("||")); 58 document.write("<br />"); 59 document.write("<hr />"); 60 ary.splice(1,1,"x"); // 替換,將第1個元素(注意前邊有0元素),替換成X 61 document.write(ary.join("||")); 62 63 //Date 64 var data1 = new Date(Date.UTC(2005,4,5,17,55,55)); // 注意月是從0開始的,所以 4 表示 5月 65 // 正則表達式,主要作用是從一個字符串中挑出想要內容, 匹配和替換 66 var text = "I am a student, how about you ?"; 67 var pattern = /[ot]u/gi; 68 var matches = pattern.exec(text); // exec 用來執行返回結果 69 70 document.write("<br />"); 71 document.write("<hr />"); 72 document.write(matches); //返回 tu 73 if ( pattern.test(text) ) { // test 用來判斷,返回 true or false 74 document.write("matched"); 75 } 76 77 } 78 79 function compare(value1, value2) { 80 if (value1 < value2) { 81 return -1; 82 } else if (value1 > value2) { 83 return 1; 84 } else { 85 return 0; 86 } 87 } 88 function f2() { 89 var x = 3; 90 var y = 4; 91 f1.call(this, x); 92 } 93 94 function f1(value) { 95 alert(value); 96 alert(y); 97 98 }?call & apply 方法 : 它們真正強大的地方是能夠擴充函數賴以運行的作用域 ,解釋如下代碼
?alert( st.b ); // 執行成功...
1 function f2() { 2 this.a = "aaa"; 3 4 f1.apply(this); // 此時,f2擁有 f1的環境,即f2擁有f1所有的屬性和方法 5 6 } 7 8 function f1(value) { 9 this.a = "111"; 10 this.b = "222"; 11 this.c = "333"; 12 this.f = function(){ 13 alert("nihao"); 14 } 15 } 16 17 var st = new f2(); 18 alert(st.a); 19 alert(st.b); // b是只有 f1 中才有的內容總結
以上是生活随笔為你收集整理的javascript引用类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js实践篇:例外处理Try{}catch
- 下一篇: javascript 数组对象中的迭代方