摘要:在這段代碼中,實(shí)際上就是閉包函數(shù)。定時(shí)器例子假設(shè),某個(gè)事件處理程序使用設(shè)置了一個(gè)間隔的重復(fù)定時(shí)器。在下一個(gè)間隔,即處,第一個(gè)定時(shí)器代碼仍在運(yùn)行,同時(shí)在隊(duì)列中已經(jīng)有了一個(gè)定時(shí)器代碼的實(shí)例。結(jié)果是,在這個(gè)時(shí)間點(diǎn)上的定時(shí)器代碼不會(huì)被添加到隊(duì)列中。
函數(shù)
匿名函數(shù)立即調(diào)用
(function (){alert(1)}())
function的左圓括號(hào)是必須的
函數(shù)的調(diào)用1,作為函數(shù)的調(diào)用,
2,作為方法的調(diào)用
嵌套函數(shù)的this沒(méi)有作用域的限制,如果作為方法調(diào)用,指調(diào)用它的對(duì)象,如果作為函數(shù)調(diào)用,this是全局對(duì)象或undefined
var o={ m:function(){ var self=this; console.log(this===o) f() function f(){ console.log(this===o)//false console.log(self===o)//true } } }
3,作為構(gòu)造函數(shù)的調(diào)用
創(chuàng)建空對(duì)象,對(duì)象的原型是構(gòu)造函數(shù)的prototype,構(gòu)造函數(shù)使用this引用這個(gè)新對(duì)象,那么 var a=new o.m()中的m中的this就不是o而是a
4,間接調(diào)用
bind apply call的區(qū)別apply和call是對(duì)函數(shù)的調(diào)用,第一個(gè)參數(shù)是改變this的指向的對(duì)象,call第二個(gè)以上傳的是每個(gè)參數(shù),apply第二個(gè)參數(shù)是數(shù)組,將要傳遞的參數(shù)寫(xiě)在數(shù)組里
兩個(gè)方法使得任何函數(shù)可以作為任意對(duì)象的方法來(lái)調(diào)用
bind的第一個(gè)參數(shù)是用來(lái)改變?cè)瘮?shù)this的指向,返回一個(gè)新函數(shù),不進(jìn)行調(diào)用
function f(y){return this.x+y} var o={x:1} var g=f.bind(o) g(2)//3
柯里化
var sum=function(x,y){return x+y} var suc=sum.bind(null,1) suc(2)//3關(guān)于this
函數(shù)里的this,誰(shuí)調(diào)用它就是誰(shuí),作為誰(shuí)的構(gòu)造函數(shù)就是誰(shuí),通過(guò)apply call可以改變
什么是作用域js中每個(gè)函數(shù)是一個(gè)作用域,在函數(shù)中聲明的變量和函數(shù)的參數(shù)在整個(gè)函數(shù)體包括其嵌套函數(shù)都是可見(jiàn)的
var scope="gl" function ch(){ var scope="cb" function ne(){ var scope="ne" return scope } return ne() } ch()//ne // function test(o){ var i=0; if(typeof o=="object"){ var j=0; for(var k=0;k<10;k++){ console.log(k) } console.log(k) } console.log(j) } test({a:7})//i k j都是在該函數(shù)作用域內(nèi)有定義的
聲明提前,只要變量在函數(shù)內(nèi)定義了,這個(gè)變量在該作用域的任意地方都可用,甚至在變量之前的位置
// var scope="glo" function f(){ console.log(scope) var scope="local" console.log(scope) } f()//undefined local
作用域鏈
變量層層向上向外的作用域?qū)ふ?函數(shù)的參數(shù)屬于函數(shù)的局部變量)
函數(shù)自己調(diào)用自己
什么是閉包閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn),也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)。
下面就是我的學(xué)習(xí)筆記,對(duì)于Javascript初學(xué)者應(yīng)該是很有用的。
一、變量的作用域
要理解閉包,首先必須理解Javascript特殊的變量作用域。
變量的作用域無(wú)非就是兩種:全局變量和局部變量。
Javascript語(yǔ)言的特殊之處,就在于函數(shù)內(nèi)部可以直接讀取全局變量。
var n=999; function f1(){ alert(n); } f1(); // 999
另一方面,在函數(shù)外部自然無(wú)法讀取函數(shù)內(nèi)的局部變量。
function f1(){ var n=999; } alert(n); // error
這里有一個(gè)地方需要注意,函數(shù)內(nèi)部聲明變量的時(shí)候,一定要使用var命令。如果不用的話(huà),你實(shí)際上聲明了一個(gè)全局變量!
function f1(){ n=999; } f1(); alert(n); // 999
二、如何從外部讀取局部變量?
出于種種原因,我們有時(shí)候需要得到函數(shù)內(nèi)的局部變量。但是,前面已經(jīng)說(shuō)過(guò)了,正常情況下,這是辦不到的,只有通過(guò)變通方法才能實(shí)現(xiàn)。
那就是在函數(shù)的內(nèi)部,再定義一個(gè)函數(shù)。
function f1(){ var n=999; function f2(){ alert(n); // 999 } }
在上面的代碼中,函數(shù)f2就被包括在函數(shù)f1內(nèi)部,這時(shí)f1內(nèi)部的所有局部變量,對(duì)f2都是可見(jiàn)的。但是反過(guò)來(lái)就不行,f2內(nèi)部的局部變量,對(duì)f1就是不可見(jiàn)的。這就是Javascript語(yǔ)言特有的"鏈?zhǔn)阶饔糜?結(jié)構(gòu)(chain scope),子對(duì)象會(huì)一級(jí)一級(jí)地向上尋找所有父對(duì)象的變量。所以,父對(duì)象的所有變量,對(duì)子對(duì)象都是可見(jiàn)的,反之則不成立。
既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值,我們不就可以在f1外部讀取它的內(nèi)部變量了嗎!
function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
三、閉包的概念
上一節(jié)代碼中的f2函數(shù),就是閉包。
各種專(zhuān)業(yè)文獻(xiàn)上的"閉包"(closure)定義非常抽象,很難看懂。我的理解是,閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
由于在Javascript語(yǔ)言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量,因此可以把閉包簡(jiǎn)單理解成"定義在一個(gè)函數(shù)內(nèi)部的函數(shù)"。
所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。
四、閉包的用途
閉包可以用在許多地方。它的最大用處有兩個(gè),一個(gè)是前面提到的可以讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中。
怎么來(lái)理解這句話(huà)呢?請(qǐng)看下面的代碼。
function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000
在這段代碼中,result實(shí)際上就是閉包f2函數(shù)。它一共運(yùn)行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數(shù)f1中的局部變量n一直保存在內(nèi)存中,并沒(méi)有在f1調(diào)用后被自動(dòng)清除。
為什么會(huì)這樣呢?原因就在于f1是f2的父函數(shù),而f2被賦給了一個(gè)全局變量,這導(dǎo)致f2始終在內(nèi)存中,而f2的存在依賴(lài)于f1,因此f1也始終在內(nèi)存中,不會(huì)在調(diào)用結(jié)束后,被垃圾回收機(jī)制(garbage collection)回收。
這段代碼中另一個(gè)值得注意的地方,就是"nAdd=function(){n+=1}"這一行,首先在nAdd前面沒(méi)有使用var關(guān)鍵字,因此nAdd是一個(gè)全局變量,而不是局部變量。其次,nAdd的值是一個(gè)匿名函數(shù)(anonymous function),而這個(gè)匿名函數(shù)本身也是一個(gè)閉包,所以nAdd相當(dāng)于是一個(gè)setter,可以在函數(shù)外部對(duì)函數(shù)內(nèi)部的局部變量進(jìn)行操作。
五、使用閉包的注意點(diǎn)
1)由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
2)閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當(dāng)作對(duì)象(object)使用,把閉包當(dāng)作它的公用方法(Public Method),把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時(shí)一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。
六、思考題
如果你能理解下面兩段代碼的運(yùn)行結(jié)果,應(yīng)該就算理解閉包的運(yùn)行機(jī)制了。
代碼片段一。
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ return function(){ return this.name; }; } }; alert(object.getNameFunc()());
代碼片段二。
var name = "The Window"; var object = { name : "My Object", getNameFunc : function(){ var that = this; return function(){ return that.name; }; } }; alert(object.getNameFunc()());
function cr(){ var n=0; return { count:function(){return n++}, reset:function(){n=0} } } var c=cr(),d=cr() c.count()//0 d.count()//0 c.reset() c.count()//0 d.count()//1
每次函數(shù)調(diào)用時(shí),形成新的對(duì)象來(lái)保存局部變量。
垃圾回收
函數(shù)內(nèi)的變量,在函數(shù)調(diào)用之后會(huì)被從內(nèi)存刪除,但如果函數(shù)內(nèi)的嵌套函數(shù)被作為返回值,被某個(gè)變量引用,那么嵌套函數(shù)里的變量將不會(huì)被內(nèi)存回收
var y=x;如果x指向一個(gè)對(duì)象的引用,那么y也是,而非這個(gè)對(duì)象的復(fù)本,通過(guò)y修改對(duì)象,也會(huì)對(duì)x造成影響
創(chuàng)建對(duì)象的三種方式
1,直接量 var obj={a:1}
2,new 構(gòu)造函數(shù)
3,Object.create(對(duì)象)
原型鏈
除了Object.prototype和null,任何對(duì)象都繼承自另外一個(gè)對(duì)象,即原型,往上追溯,形成原型鏈(家譜)
繼承的話(huà),不會(huì)改變?cè)偷膶傩灾?/p>
function inherit(p){ if(p==null) throw TypeError() if(Object.create) return Object.create(p) var t=typeof p if(t!=="object" && t!=="function") throw TypeError() function f(){} f.prototype=p return new f() } var u={r:1} var c=inherit(u) c.x=1;c.y=1; c.r=3 console.log(u.r)//1
刪除屬性
delete刪除可配置性為true的自有屬性,不能刪除繼承屬性
檢測(cè)對(duì)象是否有屬性的四個(gè)方法
1,in
var o={x:1} "x" in o //true "toString" in o//true
2,hasOwnProperty() 檢測(cè)自有屬性,對(duì)于繼承屬性返回false
3,propertyIsEnumerable()檢測(cè)自有屬性且該屬性可枚舉
4,o.x!==undefined
枚舉屬性
for in
Object.keys() 自有可枚舉的屬性
Object.getOwnPropertyNames() 自有屬性不僅是可枚舉的屬性
getter&setter
var p={ x:1.0, y:1.0, get r(){ return this.x*this.y}, set r(v){//忽略set的返回值 if(v>0){ r=90 } }, get t(){ return 100 } }
屬性的4個(gè)特性
Object.getOwnPropertyDescriptor({x:1},"x")
//{value:1,writable:true,enumerable:true,configurable:true}
修改4個(gè)特性
var o={}
Object.defineProperty(o,"x",{value:1,writable:true,enumerable:false,configurable:true})
var p=Object.defineProperties({},{x:{value:1},y:{writable:true}})
可配置的優(yōu)先級(jí)最高
對(duì)象的屬性
原型屬性
Object.getPrototypeOf()查詢(xún)?cè)?br>isPrototypeOf()是否是它的原型(和instanceof類(lèi)型,構(gòu)成判斷是否是對(duì)象的方法)
類(lèi)屬性
Object.prototype.toString.call(obj).slice(8,-1)
可擴(kuò)展性
事件事件冒泡:由最具體的元素(嵌套層次最深的)接收,然后逐級(jí)向上傳到不具體的節(jié)點(diǎn)
事件捕獲:過(guò)程相反,
DOM2級(jí)事件流:事件捕獲=》處于目標(biāo)=》事件冒泡
事件的寫(xiě)法:
1,行內(nèi)元素
注意some和行內(nèi)在同一作用域里
點(diǎn)擊我點(diǎn)擊ta
2,DOM0級(jí)事件
onclick=function(){}//添加
onclick=null//移除
3,DOM2級(jí)事件
addEventListener("click",fn,true捕獲階段調(diào)用|false冒泡階段)
大多是是冒泡階段
removeEventListener移除的函數(shù)必須等于添加的函數(shù),這時(shí)通過(guò)多帶帶函數(shù)定義實(shí)現(xiàn)
4,事件兼容寫(xiě)法
var EventUtil = { addHandler: function(element, type, handler){ if (element.addEventListener){ element.addEventListener(type, handler, false); } else if (element.attachEvent){ element.attachEvent("on" + type, handler); } else { element["on" + type] = handler; } }, removeHandler: function(element, type, handler){ if (element.removeEventListener){ element.removeEventListener(type, handler, false); } else if (element.detachEvent){ element.detachEvent("on" + type, handler); } else { element["on" + type] = null; } }, getEvent: function(event){//獲取事件對(duì)象 return event ? event : window.event; }, getTarget: function(event){ return event.target || event.srcElement; }, preventDefault: function(event){//阻止默認(rèn)事件 if (event.preventDefault){ event.preventDefault(); } else { event.returnValue = false; } }, stopPropagation: function(event){//阻止冒泡 if (event.stopPropagation){ event.stopPropagation(); } else { event.cancelBubble = true; } } };
理解事件函數(shù)里的this target currentTarget
點(diǎn)擊頁(yè)面的#mybtn按鈕
document.body.onclick=function(event){ alert(event.currentTarget===document.body)///true alert(this===document.body)//true alert(event.target===document.getElementById("mybtn"))//true }
currentTarget始終和對(duì)象this相同,target則是事件的實(shí)際目標(biāo)
js進(jìn)程js是單線(xiàn)程的,除了主js執(zhí)行進(jìn)程外,還有代碼隊(duì)列,隨著時(shí)間,代碼按照順序添加到隊(duì)列,主進(jìn)程執(zhí)行完后,是空閑狀態(tài),后面的進(jìn)程開(kāi)始執(zhí)行。
定時(shí)器例子
假設(shè),某個(gè)onclick 事件處理程序使用setInterval()設(shè)置了一個(gè)200ms 間隔
的重復(fù)定時(shí)器。如果事件處理程序花了300ms 多一點(diǎn)的時(shí)間完成,同時(shí)定時(shí)器代碼也花了差不多的時(shí)間,
就會(huì)同時(shí)出現(xiàn)跳過(guò)間隔且連續(xù)運(yùn)行定時(shí)器代碼的情況
這個(gè)例子中的第1 個(gè)定時(shí)器是在205ms 處添加到隊(duì)列中的,但是直到過(guò)了300ms 處才能夠執(zhí)行。當(dāng)
執(zhí)行這個(gè)定時(shí)器代碼時(shí),在405ms 處又給隊(duì)列添加了另外一個(gè)副本。在下一個(gè)間隔,即605ms 處,第一
個(gè)定時(shí)器代碼仍在運(yùn)行,同時(shí)在隊(duì)列中已經(jīng)有了一個(gè)定時(shí)器代碼的實(shí)例。結(jié)果是,在這個(gè)時(shí)間點(diǎn)上的定
時(shí)器代碼不會(huì)被添加到隊(duì)列中。結(jié)果在5ms 處添加的定時(shí)器代碼結(jié)束之后,405ms 處添加的定時(shí)器代碼
就立刻執(zhí)行。
為了避免setInterval()的重復(fù)定時(shí)器的這2個(gè)缺點(diǎn),你可以用如下模式使用鏈?zhǔn)絪etTimeout()
調(diào)用。
setTimeout(function(){ //處理中 setTimeout(arguments.callee, interval); }, interval);
setTimeout(function(){ var div = document.getElementById("myDiv"); left = parseInt(div.style.left) + 5; div.style.left = left + "px"; if (left < 200){setTimeout(arguments.callee, 50); } }, 50);http
let xhr=new XMLHttpRequest(); xhr.onreadystatechange = function(){ if (xhr.readyState == 4){//已接收到全部的相應(yīng)數(shù)據(jù) if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){//304表示請(qǐng)求的資源沒(méi)被改,直接用瀏覽器的緩存 alert(xhr.responseText); } else { alert("Request was unsuccessful: " + xhr.status); } } }; xhr.open("get", "example.txt", true);//是否異步 true異步 false同步 xhr.send(null); `` 默認(rèn)情況下,在發(fā)送XHR 請(qǐng)求的同時(shí),還會(huì)發(fā)送下列頭部信息。 ? Accept:瀏覽器能夠處理的內(nèi)容類(lèi)型。 ? Accept-Charset:瀏覽器能夠顯示的字符集。 ? Accept-Encoding:瀏覽器能夠處理的壓縮編碼。 ? Accept-Language:瀏覽器當(dāng)前設(shè)置的語(yǔ)言。 ? Connection:瀏覽器與服務(wù)器之間連接的類(lèi)型。 ? Cookie:當(dāng)前頁(yè)面設(shè)置的任何Cookie。 ? Host:發(fā)出請(qǐng)求的頁(yè)面所在的域 。 ? Referer:發(fā)出請(qǐng)求的頁(yè)面的URI。注意,HTTP 規(guī)范將這個(gè)頭部字段拼寫(xiě)錯(cuò)了,而為保證與規(guī) 范一致,也只能將錯(cuò)就錯(cuò)了。(這個(gè)英文單詞的正確拼法應(yīng)該是referrer。) ? User-Agent:瀏覽器的用戶(hù)代理字符串。 雖然不同瀏覽器實(shí)際發(fā)送的頭部信息會(huì)有所不同,但以上列出的基本上是所有瀏覽器都會(huì)發(fā)送的。 經(jīng)常設(shè)置的請(qǐng)求頭是
xhr.setRequestHeader("Content-Type", "application/json")
//設(shè)置header的需要放在open之后 請(qǐng)求參數(shù)為JSON.stringify({})
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
//如果請(qǐng)求參數(shù)需序列化為查詢(xún)字符串
請(qǐng)求參數(shù)序列化的方法
1,使用new FormData()的方便之處體現(xiàn)在不必明確地在XHR 對(duì)象上設(shè)置請(qǐng)求頭部。XHR 對(duì)象能夠識(shí)別傳
入的數(shù)據(jù)類(lèi)型是FormData 的實(shí)例,并配置適當(dāng)?shù)念^部信息。
2,qs.stringify(json)
3,表單序列化serialize(document.getElementById("user-info"))
4,直接傳"a=b&c=d"
文件postexample.php 就可以通過(guò)$_POST 取得提交的數(shù)據(jù)了:
如果不設(shè)置Content-Type 頭部信息,那么發(fā)送給服務(wù)器的數(shù)據(jù)就不會(huì)出現(xiàn)在$_POST 超級(jí)全局變
量中。這時(shí)候,要訪(fǎng)問(wèn)同樣的數(shù)據(jù),就必須借助$HTTP_RAW_POST_DATA。
5種
undefined、null、boolean、number、string、object。
typeof判斷返回值
"undefined"——如果這個(gè)值未定義;
? "boolean"——如果這個(gè)值是布爾值;
? "string"——如果這個(gè)值是字符串;
? "number"——如果這個(gè)值是數(shù)值;
? "object"——如果這個(gè)值是對(duì)象或null;
? "function"——如果這個(gè)值是函數(shù)。
alert(null == undefined); //true
數(shù)據(jù)類(lèi)型 轉(zhuǎn)換為true的值 轉(zhuǎn)換為false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零數(shù)字值(包括無(wú)窮大) 0和NaN
Object 任何對(duì)象 null
Undefined n/a undefined
NaN與任何數(shù)值都不相等,包括本身
NaN==NaN //false
Number()函數(shù)的轉(zhuǎn)換規(guī)則如下。
? 如果是Boolean 值,true 和false 將分別被轉(zhuǎn)換為1 和0。
? 如果是數(shù)字值,只是簡(jiǎn)單的傳入和返回。
? 如果是null 值,返回0。
? 如果是undefined,返回NaN。
? 如果是字符串,遵循下列規(guī)則:
? 如果字符串中只包含數(shù)字(包括前面帶正號(hào)或負(fù)號(hào)的情況),則將其轉(zhuǎn)換為十進(jìn)制數(shù)值,即"1"
會(huì)變成1,"123"會(huì)變成123,而"011"會(huì)變成11(注意:前導(dǎo)的零被忽略了);
? 如果字符串中包含有效的浮點(diǎn)格式,如"1.1",則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣,也會(huì)忽
略前導(dǎo)零);
? 如果字符串中包含有效的十六進(jìn)制格式,例如"0xf",則將其轉(zhuǎn)換為相同大小的十進(jìn)制整
數(shù)值;
? 如果字符串是空的(不包含任何字符),則將其轉(zhuǎn)換為0;
? 如果字符串中包含除上述格式之外的字符,則將其轉(zhuǎn)換為NaN。
? 如果是對(duì)象,則調(diào)用對(duì)象的valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換
的結(jié)果是NaN,則調(diào)用對(duì)象的toString()方法,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符
串值。
根據(jù)這么多的規(guī)則使用Number()把各種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為數(shù)值確實(shí)有點(diǎn)復(fù)雜。下面還是給出幾個(gè)具
體的例子吧。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
parseInt()
它會(huì)忽略字
符串前面的空格,直至找到第一個(gè)非空格字符。如果第一個(gè)字符不是數(shù)字字符或者負(fù)號(hào),parseInt()
就會(huì)返回NaN;也就是說(shuō),用parseInt()轉(zhuǎn)換空字符串會(huì)返回NaN(Number()對(duì)空字符返回0)。如
果第一個(gè)字符是數(shù)字字符,parseInt()會(huì)繼續(xù)解析第二個(gè)字符,直到解析完所有后續(xù)字符或者遇到了
一個(gè)非數(shù)字字符。例如,"1234blue"會(huì)被轉(zhuǎn)換為1234,因?yàn)?blue"會(huì)被完全忽略。類(lèi)似地,"22.5"
會(huì)被轉(zhuǎn)換為22,因?yàn)樾?shù)點(diǎn)并不是有效的數(shù)字字符。
如果字符串中的第一個(gè)字符是數(shù)字字符,parseInt()也能夠識(shí)別出各種整數(shù)格式(即前面討論的
十進(jìn)制、八進(jìn)制和十六進(jìn)制數(shù))。也就是說(shuō),如果字符串以"0x"開(kāi)頭且后跟數(shù)字字符,就會(huì)將其當(dāng)作一
個(gè)十六進(jìn)制整數(shù);如果字符串以"0"開(kāi)頭且后跟數(shù)字字符,則會(huì)將其當(dāng)作一個(gè)八進(jìn)制數(shù)來(lái)解析。
toString()
null和undefined沒(méi)有該方法
var a=["s","d"] a[99]="c" a.length//100 //其他項(xiàng)是undefined
數(shù)組的方法
Array.isArray()// true false
sort(比較函數(shù))方法
比較函數(shù)接收兩個(gè)參數(shù),如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之前則返回一個(gè)負(fù)數(shù),如果兩個(gè)參數(shù)相等
則返回0,如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之后則返回一個(gè)正數(shù)
concat(單個(gè)值或數(shù)組,...) 數(shù)組的副本
正則 實(shí)例屬性g
i
m
轉(zhuǎn)義:模式中使用的所有元字符都必須轉(zhuǎn)義 ( [ { ^ $ | ) ? * + .]}
字面量:不加字符串 轉(zhuǎn)義
構(gòu)造函數(shù):字符串形式 。所有元字符都必須雙重轉(zhuǎn)義
(字符在字符串中通常被轉(zhuǎn)義為,而在正則表達(dá)式字符串中就
會(huì)變成)
/whello123/ "whello123"
var re = null, i; for (i=0; i < 10; i++){ re = /cat/g; re.test("catastrophe"); } for (i=0; i < 10; i++){ re = new RegExp("cat", "g"); re.test("catastrophe"); }實(shí)例方法
正則.exec(字符串)
.test
構(gòu)造函數(shù)形式.toString() //字面量
構(gòu)造函數(shù)形式.toLocaleString() //字面量
.search()
.match()
.replace()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97955.html
摘要:前端月刊周刊文章百度前端圈奇虎團(tuán)隊(duì)規(guī)范妙趣課堂開(kāi)發(fā)社區(qū)百度規(guī)范騰訊淘寶攜程前端美團(tuán)技術(shù)博客博客一峰老趙較舊舊深入理解系列安全相關(guān)頁(yè)凹凸實(shí)驗(yàn)室前端開(kāi)發(fā)規(guī)范攜程文章瀏覽器是如何工作的英文前端代碼規(guī)范及最佳實(shí)踐 前端月刊:https://www.kancloud.cn/jsfro... 周刊文章http://ourjs.com/http://www.feweekly.com/issuesht...
摘要:前端月刊周刊文章百度前端圈奇虎團(tuán)隊(duì)規(guī)范妙趣課堂開(kāi)發(fā)社區(qū)百度規(guī)范騰訊淘寶攜程前端美團(tuán)技術(shù)博客博客一峰老趙較舊舊深入理解系列安全相關(guān)頁(yè)凹凸實(shí)驗(yàn)室前端開(kāi)發(fā)規(guī)范攜程文章瀏覽器是如何工作的英文前端代碼規(guī)范及最佳實(shí)踐 前端月刊:https://www.kancloud.cn/jsfro... 周刊文章http://ourjs.com/http://www.feweekly.com/issuesht...
摘要:在做時(shí),不可避免地要上傳一些文件,最常用到的就是圖片。提供電子郵件服務(wù)的站點(diǎn),除了圖片還需要上傳文檔等其他類(lèi)型文件的功能。當(dāng)點(diǎn)擊所看到的按鈕時(shí),實(shí)際點(diǎn)擊的是原生上傳控件,這樣一來(lái)就觸發(fā)了瀏覽器默認(rèn)行為,即打開(kāi)選擇文件對(duì)話(huà)框。 在做 Web App 時(shí),不可避免地要上傳一些文件,最常用到的就是圖片。在線(xiàn)相冊(cè)及圖片收藏網(wǎng)站等以提供圖片存儲(chǔ)服務(wù)的站點(diǎn)自不用說(shuō),社交網(wǎng)絡(luò)的頭像、發(fā)布信息等都需要...
摘要:引言半月刊第四期來(lái)啦,這段時(shí)間新增了道高頻面試題,今天就把最近半月匯總的面試題和部分答案發(fā)給大家,幫助大家查漏補(bǔ)缺,歡迎加群互相學(xué)習(xí)。更多更全的面試題和答案匯總在下面的項(xiàng)目中,點(diǎn)擊查看。引言 半月刊第四期來(lái)啦,這段時(shí)間 Daily-Interview-Question 新增了 14 道高頻面試題,今天就把最近半月匯總的面試題和部分答案發(fā)給大家,幫助大家查漏補(bǔ)缺,歡迎 加群 互相學(xué)習(xí)。 更多更...
閱讀 2866·2021-11-11 10:58
閱讀 1920·2021-10-11 10:59
閱讀 3489·2019-08-29 16:23
閱讀 2324·2019-08-29 11:11
閱讀 2785·2019-08-28 17:59
閱讀 3838·2019-08-27 10:56
閱讀 2049·2019-08-23 18:37
閱讀 3111·2019-08-23 16:53