當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
javascript权威指南学习笔记
生活随笔
收集整理的這篇文章主要介紹了
javascript权威指南学习笔记
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?一.數(shù)據(jù)類型:
js中,所有的數(shù)字都是浮點(diǎn)型的。 isNaN()/isFinite() ? ? //檢測(cè)數(shù)據(jù)類型 Infinity ? ? ? ? ? ? ? //無窮大 Number.MAX_VALUE ? ? ? //可表示的最大數(shù)字 Number.MIN_VALUE ? ? ? //可表示的最小數(shù)字 數(shù)字轉(zhuǎn)字符串 n+"" String(N) n.toString() ? ? ? //可以加參數(shù) 2-2進(jìn)制 8-8進(jìn)制 16-16進(jìn)制 n.toFixed() ? ? ? ?//顯示小數(shù)點(diǎn)后的指定位數(shù) n.toExponential() ?//指數(shù)表示 n.toPrecision() ? ?//指定有意思的位數(shù) 字符串轉(zhuǎn)數(shù)字 +字符串? parseInt(string,16) ? ?//截取整數(shù),支持另一個(gè)參數(shù)指定解析的數(shù)字基數(shù)(2-36) parseFloat() ? ? ? ? ? //截取整數(shù)和浮點(diǎn)數(shù) 布爾類型轉(zhuǎn)換 1.布爾轉(zhuǎn)其他 true-1 ?true-"true" false-0 false-"false" 2.其他轉(zhuǎn)布爾 數(shù)字 ?0/NaN-false 其他-true 字符串 ?空字符串-false ?其他-true 對(duì)象 ? ?空值/未定義的值-false ?非空對(duì)象、數(shù)組、函數(shù)-true 3.顯示轉(zhuǎn)換 Boolean(x)/!!x null的轉(zhuǎn)換 布爾 ? null-false 數(shù)字 ? null-0 字符串 null-"null" undefined的轉(zhuǎn)換 布爾 ? undefined-false 數(shù)字 ? undefined-NaN 字符串 undefined-"undefined" date類型轉(zhuǎn)換/格式化 date -- string date.toGMTString() date.toLocaleString() string -- date new Date(s) string -- string var date = new Date(s) date.toLocaleString() ===等同 數(shù)值和string只要值相等就完全相等。 兩個(gè)值同為null或undefined就完全相等。 只要有一個(gè)為NaN就不完全相等。 引用同一個(gè)對(duì)象、數(shù)組或函數(shù)就完全相等。 ==相等 同類型數(shù)據(jù)比較,相等就相等。 不同類型數(shù)據(jù)比較,先轉(zhuǎn)換成同類型數(shù)據(jù)再比較。 null和undefined相等。 二.變量 未用var聲明的變量會(huì)被創(chuàng)建為全局變量。 js中沒有塊級(jí)作用域,函數(shù)中聲明的所有變量在函數(shù)內(nèi)都有定義。 ---------------------------------------------- function test(){ for(var k=0;k<10;k++){ alert(k); } alert(k); ? ? ? ? ? ? //10 } ---------------------------------------------- js解釋器運(yùn)行時(shí)先創(chuàng)建一個(gè)全局對(duì)象,對(duì)象的屬性就是js程序的全局變量。 js函數(shù)都運(yùn)行在自己獨(dú)有的執(zhí)行環(huán)境。具有自己的調(diào)用對(duì)象。調(diào)用的對(duì)象的屬性就是該函數(shù)的局部變量。 三.運(yùn)算符 in 要求左邊是字符串或可以被轉(zhuǎn)換成字符串,右邊是數(shù)組或函數(shù)。 delete var聲明的變量不能刪除,當(dāng)delete操作的不是屬性、數(shù)組元素或變量時(shí)返回true ------------------------------------------ delete 1; ? ? ? ? ? //true delete x; ? ? ? ? ? //true ------------------------------------------ void 舍棄運(yùn)算數(shù)的值,返回undefined,常用在客戶端的javascript:URl中,計(jì)算表達(dá)式的值,而瀏覽器不會(huì)顯示這個(gè)值。 另一個(gè)用途是專門生成undefined值。undefined是在javascript1.5中實(shí)現(xiàn),考慮向后兼容,用void 0比undefined更有用。 <a href="javascript:void window.open();">Open New Window</a> a href="javascript:void(0)" 如果是個(gè)# ,就會(huì)出現(xiàn)跳到頂部的情況,:個(gè)人收藏的幾種方法: 1:<a href="####"></a> 2:<a href="javascript:void(0)"></a> 3:<a href="javascript:void(null)"></a> 4:<a href="#" false"></a> 5:<span style="cursor:hand"></span>(在FF中不能顯示) 方法2和3有可能導(dǎo)致頁面中的GIF動(dòng)畫停止播放,推薦使用方法4 ,運(yùn)算符 先計(jì)算左邊的參數(shù),再計(jì)算右邊的參數(shù),然后返回右邊參數(shù)的值 undefined不是保留字,為了確保其值不被改變,可以聲明一個(gè)未賦值的變量 -------------------------------------------- var undefined; ? ? ? ? ? ? ? ?//undefined為undefined -------------------------------------------- 未聲明的變量alert會(huì)報(bào)error錯(cuò),typeof會(huì)返回undefined null與undefined關(guān)系 undefined實(shí)際是null派生的,兩者相等 var t1 = 56; ? var t2 = 070; ? var t3 = 0x38; ? alert(t1==t2); //output:true ? alert(t2==t3); //output:true ? 這說明無論是8進(jìn)制、16進(jìn)制,其變量都保存的是10進(jìn)制的值。 數(shù)值運(yùn)算優(yōu)先調(diào)用valueOf,字符串或輸出運(yùn)算優(yōu)先調(diào)用toString. 四.語句 switch語句 匹配case表達(dá)式是用===等同運(yùn)算符判斷的,所以表達(dá)式必須在沒有類型轉(zhuǎn)換的情況下進(jìn)行。 for/in語句 for(variable in object) statement with語句(代碼很難優(yōu)化,運(yùn)行速度慢,不建議使用) with語句用于暫時(shí)修改作用域鏈 with(object) statement 這條語句將object添加到作用域鏈的頭部,然后執(zhí)行statement,在把作用域鏈恢復(fù)到原始狀態(tài)。 五.對(duì)象和數(shù)組 對(duì)象創(chuàng)建: ---------------------------------------------------- var obj = {}; var obj = new Object(); ---------------------------------------------------- 遍歷對(duì)象: ---------------------------------------------------- for(var name in o) statement ---------------------------------------------------- 檢測(cè)屬性的存在: ---------------------------------------------------- if("x" in o) if(o.x !==undefined) //區(qū)別當(dāng)一個(gè)屬性定義為o.x=undefined時(shí),上一個(gè)有操作,后一個(gè)不做任何操作。 ---------------------------------------------------- 刪除屬性: ---------------------------------------------------- delete o.xxx ---------------------------------------------------- 刪除操作將屬性從對(duì)象中移除,for/in不會(huì)枚舉該屬性。 Object的constructor屬性 每個(gè)對(duì)象都有一個(gè)constructor屬性,他引用初始化之個(gè)對(duì)象的構(gòu)造函數(shù)。 ---------------------------------------------------------------------------------------------------- if((type o == "object")&&(o.constructor == Date)) ? ? ? ?//確定一個(gè)位置值的類型。 if((type o == "object")&&(o instanceof Date)) ? ? ? ? ? ?//instanceof檢查constructor屬性的值。 ---------------------------------------------------------------------------------------------------- 檢測(cè)對(duì)象的一個(gè)屬性是不是非繼承屬性 ---------------------------------------------------- o.hasOwnProperty("a"); ---------------------------------------------------- 檢測(cè)一個(gè)對(duì)象的類型強(qiáng)烈建議使用Object.property.toString方法。 typeof只使用在檢測(cè)一個(gè)變量是否已經(jīng)定義。 ---------------------------------------------------- Object.prototype.toString.call([]) //"[object Array]" typeof foo !== 'undefined' ---------------------------------------------------- instanceof 操作符用來比較兩個(gè)操作數(shù)的構(gòu)造函數(shù)。只有在比較自定義的對(duì)象時(shí)才有意義。? 如果用來比較內(nèi)置類型,將會(huì)和 typeof 操作符 一樣用處不大。應(yīng)該僅僅用來比較來自同一個(gè) JavaScript 上下文的自定義對(duì)象 數(shù)組: Array對(duì)象的創(chuàng)建 1.new Array(10) 2.new Array("1","2") 3.["1","2"] js中數(shù)組是稀疏的,所以數(shù)組的下標(biāo)不必落在一個(gè)連續(xù)的數(shù)字范圍 ------------------------------------------- a[0] = 1; a[10000] = 10000; //js解釋器只給下標(biāo)為0和10000的元素分配內(nèi)存 ------------------------------------------- 遍歷數(shù)組: js中數(shù)組是對(duì)象,用for in循環(huán)會(huì)枚舉原型鏈上所有屬性,過濾屬性的方式是用hasOwnProperty函數(shù),會(huì)比普通的for慢。 推薦使用經(jīng)典的for循環(huán),通過l=list.length來緩存數(shù)組的長(zhǎng)度。 --------------------------------------- var list = [1,2,3,4,......10000000000]; for(var i=0;l=list.length;i<l;i++){ alert(i); } --------------------------------------- delete操作和對(duì)對(duì)象的操作不同,對(duì)數(shù)組操作元素設(shè)置為undefined ,元素本身還存在 數(shù)組方法: join()? 把數(shù)組中所有元素轉(zhuǎn)換成字符串 ---------------------------------------- var array = [1,2,3]; alert(array.join("|")); ? ? //1|2|3 ---------------------------------------- reverse() 顛倒數(shù)組元素的順序。 ?--改變?cè)瓟?shù)組 sort() 排序 ?默認(rèn)是按字母順序。 a.sort(function(a,b){ return a-b; }); ? ? ? ? ? ? ? ? ? --改變?cè)瓟?shù)組 concat() 數(shù)組連接。如果參數(shù)是數(shù)組將被展開連接,但不支持遞歸的展開。 ? ?--不改變?cè)瓟?shù)組 --------------------------------------------------------------- var a = [1,2,3]; alert(a.concat(4,[5,[6,7]])); ? ? ? ? //[1,2,3,4,5,[6,7]] --------------------------------------------------------------- slice() 截?cái)?shù)組。第一個(gè)參數(shù)是起始位置,第二個(gè)參數(shù)是結(jié)束位置。參數(shù)為負(fù)則相對(duì)于數(shù)組最后一個(gè)元素。 ? --不改變?cè)瓟?shù)組 --------------------------------------------------------------- var a = [1,2,3,4,5]; alert(a.slice(1,-1)); ? ? ? ? ? ? ? ? //[2,3,4] --------------------------------------------------------------- splice() 插入或刪除數(shù)組元素。第一個(gè)參數(shù)是插入或刪除元素的位置,第二個(gè)參數(shù)是刪除的個(gè)數(shù),后面元素是插入的元素。 --改變?cè)瓟?shù)組 --------------------------------------------------------------- var a = [1,2,3,4,5]; ? ? ? ? ? ? ? ? ?//Returns [3,4] alert(a.splice(2,2,[1,2],3)); ? ? ? ? //a=[1,2,[1,2],3,5]? --------------------------------------------------------------- push()/pop() 從數(shù)組的尾部添加或刪除元素。返回?cái)?shù)組新長(zhǎng)度。 unshift()/shift() 從數(shù)組的頭部添加或刪除元素。返回?cái)?shù)組新長(zhǎng)度。 toStirng()/valueOf ? 每個(gè)數(shù)組元素調(diào)用toString()然后用","連接. 六.函數(shù) 函數(shù)定義 function square(x){ return x*x;} var square = function(x) { return x*x;} var square = new Functioin("x","return x*x;"); 函數(shù)參數(shù) js函數(shù)可以以任意數(shù)目的參數(shù)來調(diào)用,而不管函數(shù)定義中的參數(shù)個(gè)數(shù) 函數(shù)中判斷一個(gè)參數(shù)是否傳進(jìn)來 --------------------------------------------- if(!a) a=[]; a=a||[]; --------------------------------------------- arguments對(duì)象; 實(shí)際傳的參數(shù)列表,類似數(shù)組功能,有數(shù)組下標(biāo)屬性和length屬性 arguments對(duì)象為其內(nèi)部屬性以及函數(shù)形式參數(shù)創(chuàng)建getter和setter方法。 改變形參的值會(huì)影響到arguments對(duì)象的值,反之亦然。 ------------------------------------------- function foo(a,b,c){ arguments[0] = 2; a; ? ? ? ? ? ? ?//2 b=4; arguments[1]; ? //4 var d = c; d = 9; c; ? ? ? ? ? ? ?//3 } foo(1,2,3); ------------------------------------------- arguments是java標(biāo)識(shí)符避免同名變量 callee屬性: 引用當(dāng)前正在執(zhí)行的函數(shù),可以用作對(duì)未命名函數(shù)遞歸調(diào)用 -------------------------------------------- function(x){ if(x<=1) return 1; return x*arguments.callee(x-1); } -------------------------------------------- length屬性: 定義函數(shù)的實(shí)際參數(shù)數(shù) prototype屬性: 每個(gè)函數(shù)都有一個(gè)prototype屬性,它引用的是預(yù)定義的原型對(duì)象。 call和apply方法: 第一個(gè)參數(shù)是要調(diào)用函數(shù)的對(duì)象,后面參數(shù)是函數(shù)的參數(shù)。 apply傳遞給函數(shù)的參數(shù)是由數(shù)組指定。 Function構(gòu)造函數(shù): 最后一個(gè)參數(shù)是函數(shù)體,如果前面有參數(shù)是函數(shù)參數(shù) 閉包: 定義在函數(shù)內(nèi)部的函數(shù): 用于讀取函數(shù)的局部變量, 函數(shù)返回局部變量 讓這些變量的值始終保持在內(nèi)存中 調(diào)用閉包的變量聲明為全局變量。 當(dāng)一個(gè)函數(shù)作為函數(shù)而不是方法來調(diào)用的時(shí)候,this指向的是全局對(duì)象 -------------------------------------------------------------- var name = "ferry_passion"; var obj = { "name":"ferry", getName:function(){ alert(this.name); ? ? ? ? ?//ferry return function(){ return this.name; } } }; alert(obj.learn()()); ? ? ? ? ? ? ? ? ? ? ?//ferry_passion -------------------------------------------------------------- 七.類、構(gòu)造函數(shù)、原型 Math類 方法: random 前開后開,取0-1之間偽隨機(jī)數(shù) ceil ?前開后閉,對(duì)一個(gè)數(shù)進(jìn)行上舍入 floor 前閉后開,對(duì)一個(gè)數(shù)進(jìn)行下舍入 round ?就近取整 max ? ?最大值 min ? ?最小值 String類 對(duì)象創(chuàng)建: new String("Hi") Stinrg("Hi") "Hi" 方法: indexOf ?檢索字符串 lastIndexOf ?從后向前檢索字符串 1、字符位置是從0開始索引 2、即使是從后往前查找,返回位置時(shí)也還是位置0開始計(jì)算 3、當(dāng)在字符串中索引不到該子串時(shí),返回-1值。 charAt ?返回在指定位置的字符 charCodeAt ?返回在指定位置的字符的Unicode編碼 slice(a[,b]) ?截取字符串 substring(a[,b]) ?取子串 substr(a[,length]) ?取子串 slice和substr,當(dāng)a為負(fù)數(shù)從字符串尾部開始計(jì)算 substring為負(fù)數(shù)從0開始計(jì)算 match ? ?在字符串中檢索指定的值,返回匹配結(jié)果的數(shù)組 search 檢索指定的子字符串,返回相匹配的子串起始位置,沒有匹配返回-1 toLowerCase ?轉(zhuǎn)小寫 toUpperCase ?轉(zhuǎn)大寫 實(shí)例化obj對(duì)象三步: ------------------------------------------ function A(x){ this.x = x; } var obj = new A(1); ------------------------------------------ 1.創(chuàng)建obj對(duì)象:obj = new Object(); 2.將obj的內(nèi)部_proto_指向構(gòu)造他的函數(shù)A的prototype,同時(shí)obj.constructor===A.prototype.constructor 3.將obj作為this去調(diào)用構(gòu)造函數(shù)A,初始化 區(qū)分繼承屬性和常規(guī)屬性的方法: Object.hasOwnProperty() 在原型對(duì)像中定義方法,對(duì)象中都可以用,原型對(duì)象的endsWith方法是唯一的副本共享,每個(gè)對(duì)象不創(chuàng)建單獨(dú)副本。 String.prototype.endsWith = function(c){} 絕對(duì)不能在Object.prototype添加屬性,因?yàn)樘砑拥膶傩钥梢杂胒or/in循環(huán)枚舉,而{}對(duì)象沒有可枚舉屬性,在對(duì)象用作關(guān)聯(lián)數(shù)組代碼會(huì)出錯(cuò)。 要在js中定義一個(gè)類方法只要讓相應(yīng)的函數(shù)成為構(gòu)造函數(shù)的一個(gè)屬性。 -------------------------------------------- function Circle(radius){ this.r = radius; } Circle.max = function(a,b){}; Circle.max(c,d); -------------------------------------------- 一個(gè)類的屬性聲明為私有的可以使用閉包。 -------------------------------------------- function f(a,b){ this.a = function(){return a;} this.b = function(){return b;} } -------------------------------------------- typeof null ?-- ?object typeof undefined -- undefined typeof 數(shù)組 ?-- object typeof 函數(shù) ?-- function 原型eg1: ------------------------------------------------ 1 ?function A(x){ 2 ? this.x = x; 3 ?} 4 ?A.prototype.a = "a"; 5 ?function B(x,y){ 6 ? this.y = y; 7 ? A.call(this,x); 8 ?} 9 ?B.prototype.b1 = function(){ 10 ? alert("b1"); 11 ?} 12 ?B.prototype = new A(); 13 ?B.prototype.b2 = function(){ 14 ? alert("b2"); 15 ?} 16 ?B.prototype.constructor = B; 17 ?var obj = new B(1,3); ------------------------------------------------ 這個(gè)例子講的就是B繼承A。第7行類繼承:A.call(this.x);。實(shí)現(xiàn)原型繼承的是第12行:B.prototype = new A(); 就是說把B的原型指向了A的1個(gè)實(shí)例對(duì)象,這個(gè)實(shí)例對(duì)象具有x屬性,為undefined,還具有a屬性,值為"a"。所以B原型也具有了這2個(gè)屬性(或者說,B和A建立了原型鏈, B是A的下級(jí))。而因?yàn)榉讲诺念惱^承,B的實(shí)例對(duì)象也具有了x屬性,也就是說obj對(duì)象有2個(gè)同名的x屬性,此時(shí)原型屬性x要讓位于實(shí)例對(duì)象屬性x,所以obj.x是1, 而非undefined。第13行又定義了原型方法b2,所以B原型也具有了b2。雖然第9~11行設(shè)置了原型方法b1,但是你會(huì)發(fā)現(xiàn)第12行執(zhí)行后,B原型不再具有b1方法, 也就是obj.b1是undefined。因?yàn)榈?2行使得B原型指向改變,原來具有b1的原型對(duì)象被拋棄,自然就沒有b1了。 第12行執(zhí)行完后,B原型(B.prototype)指向了A的實(shí)例對(duì)象,而A的實(shí)例對(duì)象的構(gòu)造器是構(gòu)造函數(shù)A, 所以B.prototype.constructor就是構(gòu)造對(duì)象A了(換句話說,A構(gòu)造了B的原型)。 alert(B.prototype.constructor)出來后就是"function A(x){...}" 。同樣地,obj.constructor也是A構(gòu)造對(duì)象,alert(obj.constructor)出來后就是"function A(x){...}" , 也就是說B.prototype.constructor===obj.constructor(true),但是B.prototype===obj.constructor.prototype(false),因?yàn)榍罢呤荁的原型,具有成員:x,a,b2, 后者是A的原型,具有成員:a。如何修正這個(gè)問題呢,就在第16行,將B原型的構(gòu)造器重新指向了B構(gòu)造函數(shù),那么B.prototype===obj.constructor.prototype(true), 都具有成員:x,a,b2。 如果沒有第16行,那是不是obj = new B(1,3)會(huì)去調(diào)用A構(gòu)造函數(shù)實(shí)例化呢?答案是否定的,你會(huì)發(fā)現(xiàn)obj.y=3,所以仍然是調(diào)用的B構(gòu)造函數(shù)實(shí)例化的。 雖然obj.constructor===A(true),但是對(duì)于new B()的行為來說,執(zhí)行了上面所說的通過構(gòu)造函數(shù)創(chuàng)建實(shí)例對(duì)象的3個(gè)步驟,第一步,創(chuàng)建空對(duì)象;第二步, obj.__proto__ === B.prototype,B.prototype是具有x,a,b2成員的,obj.constructor指向了B.prototype.constructor,即構(gòu)造函數(shù)A; 第三步,調(diào)用的構(gòu)造函數(shù)B去設(shè)置和初始化成員,具有了屬性x,y。雖然不加16行不影響obj的屬性,但如上一段說,卻影響obj.constructor和obj.constructor.prototype。 所以在使用了原型繼承后,要進(jìn)行修正的操作。 關(guān)于第12、16行,總言之,第12行使得B原型繼承了A的原型對(duì)象的所有成員,但是也使得B的實(shí)例對(duì)象的構(gòu)造器的原型指向了A原型,所以要通過第16行修正這個(gè)缺陷。 原型eg2: -------------------------------------------------------- function Foo() { this.value = 42; } Foo.prototype = { method: function() {} }; function Bar() {} // 設(shè)置Bar的prototype屬性為Foo的實(shí)例對(duì)象 Bar.prototype = new Foo(); Bar.prototype.foo = 'Hello World'; // 修正Bar.prototype.constructor為Bar本身 Bar.prototype.constructor = Bar; var test = new Bar() // 創(chuàng)建Bar的一個(gè)新實(shí)例 --------------------------------------------------------- // 原型鏈 test [Bar的實(shí)例] Bar.prototype [Foo的實(shí)例]? { foo: 'Hello World' } Foo.prototype {method: ...}; Object.prototype {toString: ... /* etc. */}; --------------------------------------------------------- test 對(duì)象從 Bar.prototype 和 Foo.prototype 繼承下來;因此,? 它能訪問 Foo 的原型方法 method。同時(shí),它也能夠訪問那個(gè)定義在原型上的 Foo 實(shí)例屬性 value。 需要注意的是 new Bar() 不會(huì)創(chuàng)造出一個(gè)新的 Foo 實(shí)例,而是 重復(fù)使用它原型上的那個(gè)實(shí)例; 因此,所有的 Bar 實(shí)例都會(huì)共享相同的 value 屬性。 注意: 不要使用 Bar.prototype = Foo,因?yàn)檫@不會(huì)執(zhí)行 Foo 的原型, 而是指向函數(shù) Foo。 因此原型鏈將會(huì)回溯到 Function.prototype 而不是 Foo.prototype, 因此 method 將不會(huì)在 Bar 的原型鏈上。 當(dāng)查找一個(gè)對(duì)象的屬性時(shí),js會(huì)向上遍歷原型鏈,直到頂層沒找到就返回undefined。 要提防原型鏈過長(zhǎng)帶來的性能問題,并知道如何通過縮短原型鏈來提高性能。? 更進(jìn)一步,絕對(duì)不要擴(kuò)展內(nèi)置類型的原型,除非是為了和新的 JavaScript 引擎兼容。 js兩個(gè)小括號(hào)()()連用:函數(shù)會(huì)被立即執(zhí)行 --------------------------------------- (function(){alert("aaa");})(); function foo(){alert(1);}foo(); --------------------------------------- hasOwnProperty函數(shù)判斷對(duì)象是否包含自定義屬性而不是原型鏈上的屬性。 如果hasOwnProperty被非法占用。可以用外部的hasOwnProperty函數(shù)獲取 {}.hasOwnProperty.call(foo,'bar'); for in 循環(huán)不會(huì)遍歷那些 enumerable 設(shè)置為 false 的屬性;比如數(shù)組的 length 屬性。 八.模塊和名字空間 當(dāng)定義一個(gè)全局變量時(shí),有被其他模塊覆蓋的危險(xiǎn),為了避免定義全局變量,使用模塊化編程。 --------------------------------------------- var ModuleClass={}; ModuleClass.函數(shù)名1 = function(){ }; ModuleClass.函數(shù)名2 = function(){ }; --------------------------------------------- 使用ModuleClass對(duì)象作為名字空間,將所有函數(shù)變量以及函數(shù)都放入其中。 如果名字沖突,可以使用域的方式做多級(jí)域名 --------------------------------------------- var util; if(!util)util={}; util.ModuleClass = {}; util.ModuleClass.函數(shù)名1 = function(){ }; util.ModuleClass.函數(shù)名2 = function(){ }; --------------------------------------------- 九.正則表達(dá)式 正則表達(dá)式方法: test() 檢測(cè)指定的字符串是否存在,返回true或false exec() 查找匹配 匹配失敗返回null 匹配成功返回一個(gè)數(shù)組,數(shù)組的0元素包含完整的匹配,其他元素包含的是匹配中任意一個(gè)子匹配,并更新RegExp對(duì)象屬性 index是匹配發(fā)生的字符位置,input是被檢索的字符串 String方法 search() 指明是否存在相應(yīng)匹配,成功返回第一個(gè)成功檢索位置,失敗返回-1 replace()? 替換字符串,返回替換后的字符串 split() 分割字符串,返回分割數(shù)組 match() 如果沒有找到匹配返回null,否則返回一個(gè)數(shù)組 RegExp的方法test()和exec()受全局標(biāo)志"g"和lastIndex的影響,而string的方法match(),search()等則不受影響 在一次匹配成功后,會(huì)設(shè)置lastIndex,下一次匹配,就會(huì)從這個(gè)lastindex所指示的位置開始嘗試匹配, 當(dāng)匹配失敗時(shí),lastIndex會(huì)被重新置為0 --------------------------------------------------------------------- var arr = [1,2,3,4,5]; var reg = /^\d+$/g; for(var i = 0;i<arr.length;i++){ document.write("源字符串:"+arr[i]+" 驗(yàn)證結(jié)果:"+reg.test(arr[i])+" lastindex:"+reg.lastIndex+"<br/>"); } document.write("<br>"); var reg = /^\d+$/; for(var j = 0;j<arr.length;j++){ document.write("源字符串:"+arr[j]+" 驗(yàn)證結(jié)果:"+reg.test(arr[j])+" lastindex:"+reg.lastIndex+"<br/>"); } 結(jié)果: 源字符串:1 驗(yàn)證結(jié)果:true lastindex:1 源字符串:2 驗(yàn)證結(jié)果:false lastindex:0 源字符串:3 驗(yàn)證結(jié)果:true lastindex:1 源字符串:4 驗(yàn)證結(jié)果:false lastindex:0 源字符串:5 驗(yàn)證結(jié)果:true lastindex:1 源字符串:1 驗(yàn)證結(jié)果:true lastindex:1 源字符串:2 驗(yàn)證結(jié)果:true lastindex:1 源字符串:3 驗(yàn)證結(jié)果:true lastindex:1 源字符串:4 驗(yàn)證結(jié)果:true lastindex:1 源字符串:5 驗(yàn)證結(jié)果:true lastindex:1 --------------------------------------------------------------------- [\u4e00-\u9fa5] ?匹配任意一個(gè)漢字 \s 任意空白字符 ?(\r\n\f\t\v) \b單詞邊界 . 匹配除\n以外的字符,匹配所有字符一般用[\s\S]或.加(?s)匹配模式 ?s Single-line模式 用new RegExp()創(chuàng)建的正則要注意引號(hào)內(nèi)的轉(zhuǎn)義 js只支持順序環(huán)視,不支持逆序環(huán)視。java中支持順序環(huán)視和確定長(zhǎng)度表達(dá)式的逆序環(huán)視。 0-100的數(shù)字 ^([1-9]?[0-9]|100)$ 捕獲組 普通捕獲組()/命名捕獲組(?<name>(Expression)) 非捕獲組 (?:Expression) 消除一些不得不使用(),卻又不需要使用捕獲組而帶來內(nèi)存被占用,匹配效率降低的情況。 環(huán)視? 匹配內(nèi)容不計(jì)入最終匹配結(jié)果,零寬度[(?=Expression),(?<=Expression)] ---------------------------------------------------------------------- var str = "aa<p>one</p>bb<div>two</div>cc"; var reg = /<(?!\/?p\b)[^>]+>/; alert(str.match(reg)); ? ? ? ? ? ? ? ? ?//div ---------------------------------------------------------------------- 匹配優(yōu)先[貪婪模式]({m},{m,n},{m},?,*,+)/忽略優(yōu)先[非貪婪模式]({m}?,{m,n}?,{m,}?,??,*?,+?) 在匹配成功的情況下,貪婪模式進(jìn)行了更少的回溯,回溯過程需要進(jìn)行控制權(quán)的交接 反向引用 捕獲組在匹配成功時(shí),會(huì)將子表達(dá)式匹配到的內(nèi)容,保存到內(nèi)存中一個(gè)以數(shù)字編號(hào)的組里,可以通過反向引用方式,引用這個(gè)局部變量的值 \1/\k<name> 年份0001-9999,格式y(tǒng)yyy-MM-dd或yyyy-M-d ^(?:(?!0000)[0-9]{4}([-/.]?)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)| (?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00) ([-/.]?)0?2\2(?:29))$ 取img中的屬性。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- var data = [' <img alt="" border="0" name="g6-o44-1" src="/bmp/foo1.jpg" />', ' <img src="/bmp/foo2.jpg" alt="" border="0" name="g6-o44-2" />'] ; ? var reg = /<img\b(?=(?:(?!name=).)*name=(['"]?)([^'"\s>]+)\1)(?:(?!src=).)*src=(['"]?)([^'"\s>]+)\3[^>]*>/i; ? for(var i=0;i<data.length;i++) ? { ? var s = data[i]; ? document.getElementById("result").value += "源字符串:" + s + "\n"; ? document.write("<br />"); ? if(reg.test(s)) ? { ? document.getElementById("result").value += "name: " + RegExp.$2 + "\n"; ? document.getElementById("result").value += "src: " + RegExp.$4 + "\n"; ? } ? }? Results: 源字符串: <img alt="" border="0" name="g6-o44-1" src="/bmp/foo1.jpg" /> name: g6-o44-1 src: /bmp/foo1.jpg 源字符串: <img src="/bmp/foo2.jpg" alt="" border="0" name="g6-o44-2" /> name: g6-o44-2 src: /bmp/foo2.jpg --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- <html> <head> </head> <body> <script type="text/javascript"> var s = " ? ?f e r ? r y ?"; alert("s="+s.replace(/\s*/g,"")+"!"); ?//去所有空格 alert("s="+s.replace(/^\s*/g,"")+"!"); //去左空格 alert("s="+s.replace(/\s*$/g,"")+"!"); //去右空格 alert("s="+s.replace(/^\s*|\s*$/g,"")+"!"); //去左右空格 </script> </body> </html>轉(zhuǎn)載于:https://blog.51cto.com/smile2010/725729
總結(jié)
以上是生活随笔為你收集整理的javascript权威指南学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]XCode中修改缺省公司名称/开发
- 下一篇: TwinVQ解码框图